Truy cập một giá trị trong một bộ giá trị nằm trong danh sách


88
[(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:


100

Với một danh sách dễ hiểu .

[x[1] for x in L]

52
Tôi hiểu đây là một câu hỏi đơn giản. SO có phải là một nơi tinh hoa? Thử googling câu hỏi, kết quả không như tôi cần. Tôi đã học python một cách khó khăn và tôi không tìm thấy điều này trong đó. Tôi đã đặt câu hỏi trước đây về cách tiếp cận tốt nhất để học Python và câu trả lời nhất trí là lấy một cuốn sách cơ bản và chỉ cần đi sâu vào. Điều đó khiến tôi thất vọng cũng như không thể tìm thấy giải pháp trong bất kỳ cuốn sách hoặc tài liệu trực tuyến nào mà tôi đã tìm kiếm. cho đến nay? Thêm vào đó, bình luận của bạn thực sự không hữu ích và không khuyến khích những thành viên mới đăng bài trên SO.
super9

1
@Nai: Tôi khuyên bạn nên đọc hướng dẫn Python: docs.python.org/tutorial/index.html . Nói chung, tài liệu rất tốt. Và đôi khi, người ta chỉ cần có để thử;)
Felix Kling

19
Tôi đã lên Google "truy cập mục trong bộ" với mục đích truy cập một mục trong danh sách nhiều bộ. Nó đưa tôi đến câu hỏi của bạn vì vậy cảm ơn bạn. Tôi khá mới với Python và không tìm thấy câu trả lời đặc biệt trực quan, nhưng đó chỉ là tôi!
Patrick Williams,

7
Tôi nghĩ rằng toàn bộ khái niệm với SO là để giúp bạn tìm câu trả lời cho câu hỏi của mình dễ dàng hơn. Tại sao một câu hỏi phải có độ khó nhất định mới có giá trị? Câu hỏi hay, câu trả lời hay.
Sceluswe

3
Xuất sắc! Câu trả lời ngắn gọn, sắc nét, chính xác cho câu hỏi ngắn gọn, sắc bén, cho câu hỏi chính xác. Cả hai bạn vừa làm nên ngày của tôi!
Eric M

82

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]

  • Lưu ý []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 listloại. Do đó, kỹ thuật này được gọi là "hiểu danh sách".
  • L là danh sách ban đầu của bạn. Vì vậy, bạn nên xác định 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.
  • xlà một biến chỉ tồn tại trong phần hiểu - hãy thử truy cập xbê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.
  • Vì vậy, dòng mã này có nghĩa đen là "trả về mục thứ hai trong một bộ giá trị cho tất cả các bộ giá trị trong danh sách L."

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.


4
Trong 2.x, xsẽ 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.
Ignacio Vazquez-Abrams

Tôi đã không nhận ra điều này. Cảm ơn bạn về thông tin.
gary

4
Lời giải thích tuyệt vời @gary. Tôi đặc biệt đánh giá cao việc bạn chỉ ra những gì L đề cập đến.
Patrick Williams,

Cảm ơn phản hồi @PatrickWilliams. Tôi rất vui vì điều này có ích. Bạn cũng có thể làm [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.
gary

5

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à mapitemgetter.

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:

  1. Khai báo một biến để tham chiếu đến một danh sách trống.
  2. Vòng lặp for.
  3. Gọi appendphươ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 .


2

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]
>>> 

1

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))

0
a = [(0,2), (4,3), (9,9), (10,-1)]
print(list(map(lambda item: item[1], a)))

1
Vui lòng giải thích câu trả lời của bạn một chút để những người khác đang tìm kiếm nó dễ hiểu hơn.
herrbischoff
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.