การเข้าถึงค่าในทูเปิลที่อยู่ในรายการ


90
[(1,2), (2,3), (4,5), (3,4), (6,7), (6,7), (3,8)]

ฉันจะคืนค่าที่ 2 จากทูเปิลแต่ละตัวในรายการนี้ได้อย่างไร

ผลลัพธ์ที่ต้องการ:

[2, 3, 5, 4, 7, 7, 8]

คำตอบ:


102

ด้วยความเข้าใจในรายชื่อ

[x[1] for x in L]

54
ฉันเข้าใจว่านี่เป็นคำถามง่ายๆ ดังนั้นเป็นสถานที่ยอดเยี่ยมหรือไม่? ลองใช้ Googling คำถามผลลัพธ์ไม่ใช่สิ่งที่ฉันต้องการ ฉันเรียน Python ด้วยวิธีที่ยากและไม่พบสิ่งนี้ในนั้น ฉันเคยถามคำถามมาก่อนเกี่ยวกับวิธีที่ดีที่สุดในการเรียนรู้ Python และคำตอบที่เป็นเอกฉันท์คือการได้รับหนังสือพื้นฐานและเพียงแค่ดำน้ำมันทำให้ฉันหงุดหงิดและฉันไม่พบวิธีแก้ปัญหาในหนังสือหรือเนื้อหาออนไลน์ใด ๆ ที่ฉันค้นหา จนถึงตอนนี้? นอกจากนี้ความคิดเห็นของคุณก็ไม่เป็นประโยชน์และไม่สนับสนุนให้สมาชิกใหม่ที่เพิ่งโพสต์ใน SO
super9

1
@Nai: ฉันขอแนะนำให้อ่านหลามกวดวิชา: docs.python.org/tutorial/index.html โดยทั่วไปเอกสารนั้นดีมาก และบางครั้งก็ต้องลอง;)
Felix Kling

19
ฉัน Googled "การเข้าถึงรายการในทูเปิล" โดยมีจุดประสงค์เพื่อเข้าถึงรายการในรายการทูเปิล มันทำให้ฉันพบคำถามของคุณขอบคุณมาก ฉันค่อนข้างใหม่สำหรับ Python และไม่พบคำตอบที่เข้าใจง่ายเป็นพิเศษ แต่นั่นเป็นแค่ฉัน!
Patrick Williams

8
ฉันคิดว่าแนวคิดทั้งหมดของ SO คือช่วยให้ค้นหาคำตอบสำหรับคำถามของคุณได้ง่ายขึ้น เหตุใดคำถามจึงต้องมีความยากลำบากในการใช้งาน? ถามดีตอบดี.
Sceluswe

3
ยอดเยี่ยม! คำตอบสั้น ๆ แหลมตรงประเด็นสำหรับคำถามสั้น ๆ คม ๆ ตรงประเด็น คุณทั้งสองทำให้วันของฉัน!
Eric M

82

คำตอบของอิกนาซิโอคือสิ่งที่คุณต้องการ อย่างไรก็ตามในฐานะที่มีคนเรียน Python เช่นกันให้ฉันลองแยกมันให้คุณ ... ดังที่ได้กล่าวไปแล้วมันเป็นความเข้าใจในรายการ (ครอบคลุมในDiveIntoPython3เป็นต้น) นี่คือบางจุด:

[x[1] for x in L]

  • สังเกตเห็น[]รอบบรรทัดของรหัส นี่คือสิ่งที่กำหนดรายการ สิ่งนี้จะบอกคุณว่ารหัสนี้ส่งคืนรายการดังนั้นจึงเป็นlistประเภท ดังนั้นเทคนิคนี้จึงเรียกว่า "การทำความเข้าใจรายการ"
  • L คือรายการเดิมของคุณ ดังนั้นคุณควรกำหนดL = [(1,2),(2,3),(4,5),(3,4),(6,7),(6,7),(3,8)]ก่อนที่จะเรียกใช้โค้ดด้านบน
  • xเป็นตัวแปรที่มีอยู่เพียง แต่ในความเข้าใจ - พยายามที่จะเข้าถึงxด้านนอกของความเข้าใจหรือชนิดtype(x)หลังจากรันบรรทัดข้างต้นและมันจะบอกคุณNameError: name 'x' is not definedในขณะที่ผลตอบแทนtype(L)<class 'list'>
  • x[1]ชี้ไปที่รายการที่สองในแต่ละรายการในขณะที่x[0]จะชี้ไปที่แต่ละรายการแรก
  • ดังนั้นโค้ดบรรทัดนี้จึงอ่านว่า "return the second item in a tuple for all tuples in list L. "

ยากที่จะบอกว่าคุณพยายามแก้ปัญหาก่อนที่จะถามคำถามมากแค่ไหน แต่บางทีคุณอาจไม่คุ้นเคยกับความเข้าใจ? ฉันจะใช้เวลาอ่านบทที่ 3 ของ DiveIntoPythonหรือแหล่งข้อมูลใด ๆ เกี่ยวกับความเข้าใจ โชคดี.


4
ใน 2.x xจะอยู่นอก LC โดยมีค่าสุดท้ายที่ผูกไว้ สิ่งนี้ได้รับการแก้ไขใน 3.x
Ignacio Vazquez-Abrams

ฉันไม่ได้ตระหนักถึงสิ่งนี้ ขอบคุณสำหรับข้อมูล.
gary

4
คำอธิบายที่ยอดเยี่ยม @gary ฉันขอขอบคุณโดยเฉพาะอย่างยิ่งที่คุณชี้ให้เห็นว่า L หมายถึงอะไร
Patrick Williams

ขอบคุณสำหรับคำติชม @PatrickWilliams ฉันดีใจที่สิ่งนี้ช่วยได้ คุณสามารถทำได้เช่นกัน[x[1] for x in [(1,2),(2,3),(4,5),(3,4),(6,7),(6,7),(3,8)]]แต่มันไม่ง่ายอย่างที่คิด
gary

5

ความเข้าใจในรายการเป็นวิธีการทำเช่นนี้อย่างแน่นอน อีกวิธีหนึ่งที่ควรเร็วกว่าคือmapและitemgetter.

import operator

new_list = map(operator.itemgetter(1), old_list)

เพื่อตอบสนองต่อความคิดเห็นที่ OP ไม่สามารถหาคำตอบใน Google ได้ฉันจะชี้ให้เห็นถึงวิธีที่ไร้เดียงสาสุด ๆ ในการทำ

new_list = []
for item in old_list:
    new_list.append(item[1])

สิ่งนี้ใช้:

  1. การประกาศตัวแปรเพื่ออ้างอิงรายการว่าง
  2. สำหรับห่วง
  3. เรียกใช้appendเมธอดในรายการ

หากใครบางคนกำลังพยายามเรียนรู้ภาษาและไม่สามารถรวบรวมชิ้นส่วนพื้นฐานเหล่านี้ด้วยตัวเองได้พวกเขาก็ต้องมองว่ามันเป็นการออกกำลังกายและลงมือทำด้วยตัวเองแม้ว่าจะใช้เวลายี่สิบชั่วโมงก็ตาม

หนึ่งในความต้องการที่จะเรียนรู้วิธีการที่จะคิดเกี่ยวกับสิ่งที่ใครอยากและเปรียบเทียบกับเครื่องมือที่สามารถใช้ได้ ทุกองค์ประกอบในคำตอบที่สองของฉันควรอยู่ในบทช่วยสอนพื้นฐาน คุณไม่สามารถเรียนรู้ในการเขียนโปรแกรมโดยไม่ต้องอ่านอย่างใดอย่างหนึ่ง


2

คุณยังสามารถใช้ลำดับการแกะกล่องด้วย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)

นอกจากนี้ยังสร้างทูเปิล_จากองค์ประกอบแรกที่ถูกทิ้ง สามารถแยกได้เฉพาะวินาที แต่มีรายละเอียดมากกว่า:

from itertools import islice

res = next(islice(zip(*L), 1, None))

2

หรือคุณสามารถใช้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]
>>> 

หรือ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]
>>> 

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

1
โปรดอธิบายคำตอบของคุณเล็กน้อยเพื่อให้ผู้อื่นเข้าใจง่ายขึ้นสำหรับผู้ที่ค้นหา
เฮอร์บิชอฟฟ์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.