Mengakses nilai dalam tupel yang ada dalam daftar


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

Bagaimana cara mengembalikan nilai ke-2 dari setiap tupel di dalam daftar ini?

Output yang diinginkan:

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

Jawaban:


101

Dengan pemahaman daftar .

[x[1] for x in L]

53
Saya mengerti ini adalah pertanyaan sederhana. Apakah BEGITU tempat yang elitis? Coba googling pertanyaannya, hasilnya tidak sesuai yang saya butuhkan. Saya belajar python dengan cara yang sulit dan saya tidak menemukannya di sana. Saya telah mengajukan pertanyaan sebelumnya tentang pendekatan terbaik untuk belajar Python dan jawaban bulatnya adalah mendapatkan buku dasar dan langsung menyelami. Ini membuat saya frustrasi dan saya tidak dapat menemukan solusinya di buku atau materi online yang saya cari sejauh ini? Ditambah komentar Anda benar-benar tidak membantu dan mencegah anggota baru untuk memposting di SO.
super9

1
@Nai: Saya sarankan untuk membaca tutorial Python: docs.python.org/tutorial/index.html . Secara umum, dokumentasinya sangat bagus. Dan terkadang, seseorang hanya harus mencoba;)
Felix Kling

19
Saya mencari di Google "mengakses item dalam tuple" dengan maksud mengakses item dalam daftar tuple. Ini membawa saya ke pertanyaan Anda jadi terima kasih. Saya cukup baru mengenal Python dan tidak menemukan jawabannya secara intuitif, tapi itu hanya saya!
Patrick Williams

8
Saya pikir seluruh konsep SO adalah untuk mempermudah menemukan jawaban atas pertanyaan Anda. Mengapa suatu pertanyaan harus memiliki kesulitan tertentu agar valid? Pertanyaan bagus, jawaban bagus.
Sceluswe

3
Cemerlang! Jawaban singkat, tajam, langsung ke intinya untuk pertanyaan singkat, tajam, langsung ke intinya. Kalian berdua baru saja membuat hariku!
Eric M

82

Jawaban Ignacio adalah apa yang Anda inginkan. Namun, sebagai seseorang yang juga belajar Python, izinkan saya mencoba membedahnya untuk Anda ... Seperti yang disebutkan, itu adalah pemahaman daftar (tercakup dalam DiveIntoPython3 , misalnya). Berikut beberapa poinnya:

[x[1] for x in L]

  • Perhatikan []di sekitar baris kode. Inilah yang mendefinisikan daftar. Ini memberi tahu Anda bahwa kode ini mengembalikan daftar, jadi ini listtipenya. Karenanya, teknik ini disebut "pemahaman daftar".
  • L adalah daftar asli Anda. Jadi, Anda harus menentukan L = [(1,2),(2,3),(4,5),(3,4),(6,7),(6,7),(3,8)]sebelum menjalankan kode di atas.
  • xadalah variabel yang hanya ada dalam pemahaman - coba akses di xluar pemahaman, atau ketik type(x)setelah menjalankan baris di atas dan itu akan memberi tahu Anda NameError: name 'x' is not defined, sedangkan type(L)kembali <class 'list'>.
  • x[1]menunjuk ke item kedua di masing-masing tupel sedangkan x[0]akan menunjuk ke masing-masing item pertama.
  • Jadi baris kode ini secara harfiah berbunyi "mengembalikan item kedua dalam tupel untuk semua tupel dalam daftar L."

Sulit untuk mengatakan seberapa banyak Anda mencoba soal sebelum mengajukan pertanyaan, tetapi mungkin Anda tidak terbiasa dengan pemahaman? Saya akan meluangkan waktu membaca Bab 3 dari DiveIntoPython , atau sumber daya apa pun tentang pemahaman. Semoga berhasil.


4
Dalam 2.x, xakan ada di luar LC, dengan nilai terakhir terikat padanya. Ini diperbaiki dalam 3.x.
Ignacio Vazquez-Abrams

Saya tidak menyadarinya. Terimakasih atas infonya.
gary

4
Penjelasan yang luar biasa @gary. Saya menghargai terutama Anda menunjukkan apa yang dimaksud L.
Patrick Williams

Terima kasih atas umpan baliknya @PatrickWilliams. Saya senang ini membantu. Anda juga bisa melakukannya [x[1] for x in [(1,2),(2,3),(4,5),(3,4),(6,7),(6,7),(3,8)]]tetapi tidak semudah dipandang.
gary

5

Pemahaman daftar adalah cara mutlak untuk melakukan ini. Cara lain yang seharusnya lebih cepat adalah mapdan itemgetter.

import operator

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

Menanggapi komentar bahwa OP tidak dapat menemukan jawaban di google, saya akan menunjukkan cara yang sangat naif untuk melakukannya.

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

Ini menggunakan:

  1. Mendeklarasikan variabel untuk mereferensikan daftar kosong.
  2. A untuk loop.
  3. Memanggil appendmetode pada daftar.

Jika seseorang mencoba mempelajari suatu bahasa dan tidak dapat mengumpulkan potongan-potongan dasar ini untuk diri mereka sendiri, maka mereka perlu melihatnya sebagai latihan dan melakukannya sendiri bahkan jika itu membutuhkan waktu dua puluh jam.

Seseorang perlu belajar bagaimana memikirkan tentang apa yang dia inginkan dan membandingkannya dengan alat yang tersedia . Setiap elemen dalam jawaban kedua saya harus tercakup dalam tutorial dasar. Anda tidak dapat belajar membuat program tanpa membacanya .


2

Anda juga dapat menggunakan sequence unpacking dengan 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)

Ini juga membuat tupel _dari elemen pertama yang dibuang. Mengekstrak hanya yang kedua dimungkinkan, tetapi lebih bertele-tele:

from itertools import islice

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

2

ATAU Anda dapat menggunakan 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]
>>> 

Atau 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
Harap jelaskan sedikit jawaban Anda agar lebih mudah dipahami oleh orang lain yang menelusurinya.
herrbischoff
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.