[(1,2), (2,3), (4,5), (3,4), (6,7), (6,7), (3,8)]
Làm cách nào để trả về giá trị thứ 2 từ mỗi bộ trong danh sách này?
Kết quả mong muốn:
[2, 3, 5, 4, 7, 7, 8]
Câu trả lời:
Với một danh sách dễ hiểu .
[x[1] for x in L]
Câu trả lời của Ignacio là những gì bạn muốn. Tuy nhiên, là một người cũng đang học Python, hãy để tôi thử mổ xẻ nó cho bạn ... Như đã đề cập, nó là một danh sách dễ hiểu ( ví dụ như trong DiveIntoPython3 ). Dưới đây là một số điểm:
[x[1] for x in L]
[]
xung quanh dòng mã. Đây là những gì xác định một danh sách. Điều này cho bạn biết rằng mã này trả về một danh sách, vì vậy nó thuộc list
loại. Do đó, kỹ thuật này được gọi là "hiểu danh sách".L = [(1,2),(2,3),(4,5),(3,4),(6,7),(6,7),(3,8)]
trước khi thực hiện đoạn mã trên.x
là một biến chỉ tồn tại trong phần hiểu - hãy thử truy cập x
bên ngoài phần hiểu, hoặc nhập type(x)
sau khi thực hiện dòng trên và nó sẽ cho bạn biết NameError: name 'x' is not defined
, ngược lại, type(L)
trả về <class 'list'>
.x[1]
trỏ đến mục thứ hai trong mỗi bộ giá trị trong khi x[0]
sẽ trỏ đến từng mục đầu tiên.Thật khó để biết bạn đã cố gắng giải quyết vấn đề bao nhiêu trước khi đặt câu hỏi, nhưng có lẽ bạn không quen với việc hiểu? Tôi sẽ dành một chút thời gian để đọc hết Chương 3 của DiveIntoPython , hoặc bất kỳ tài nguyên nào về kiến thức. Chúc may mắn.
x
sẽ tồn tại bên ngoài LC, với giá trị cuối cùng được ràng buộc với nó. Điều này được khắc phục trong 3.x.
[x[1] for x in [(1,2),(2,3),(4,5),(3,4),(6,7),(6,7),(3,8)]]
nhưng nó không dễ dàng bằng mắt.
Hiểu danh sách hoàn toàn là cách để làm điều này. Một cách khác sẽ nhanh hơn là map
và itemgetter
.
import operator
new_list = map(operator.itemgetter(1), old_list)
Để đáp lại nhận xét rằng OP không thể tìm thấy câu trả lời trên google, tôi sẽ chỉ ra một cách cực kỳ ngây thơ để làm điều đó.
new_list = []
for item in old_list:
new_list.append(item[1])
Điều này sử dụng:
append
phương thức trên danh sách.Nếu ai đó đang cố gắng học một ngôn ngữ và không thể tập hợp những phần cơ bản này lại cho chính họ, thì họ cần phải xem nó như một bài tập và tự làm ngay cả khi mất hai mươi giờ.
Người ta cần học cách suy nghĩ về thứ mình muốn và so sánh điều đó với các công cụ có sẵn . Mọi yếu tố trong câu trả lời thứ hai của tôi nên được bao gồm trong một hướng dẫn cơ bản. Bạn không thể học lập trình nếu không đọc .
HOẶC bạn có thể sử dụng pandas
:
>>> import pandas as pd
>>> L = [(1,2),(2,3),(4,5),(3,4),(6,7),(6,7),(3,8)]
>>> df=pd.DataFrame(L)
>>> df[1]
0 2
1 3
2 5
3 4
4 7
5 7
6 8
Name: 1, dtype: int64
>>> df[1].tolist()
[2, 3, 5, 4, 7, 7, 8]
>>>
Hoặc numpy
:
>>> import numpy as np
>>> L = [(1,2),(2,3),(4,5),(3,4),(6,7),(6,7),(3,8)]
>>> arr=np.array(L)
>>> arr.T[1]
array([2, 3, 5, 4, 7, 7, 8])
>>> arr.T[1].tolist()
[2, 3, 5, 4, 7, 7, 8]
>>>
Bạn cũng có thể sử dụng giải nén trình tự với zip
:
L = [(1,2),(2,3),(4,5),(3,4),(6,7),(6,7),(3,8)]
_, res = zip(*L)
print(res)
# (2, 3, 5, 4, 7, 7, 8)
Điều này cũng tạo ra một bộ _
từ các phần tử đầu tiên bị loại bỏ. Chỉ trích xuất thứ hai là có thể, nhưng dài dòng hơn:
from itertools import islice
res = next(islice(zip(*L), 1, None))
a = [(0,2), (4,3), (9,9), (10,-1)]
print(list(map(lambda item: item[1], a)))