Listede bulunan bir demetteki değere erişme


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

Bu listedeki her bir diziden 2. değeri nasıl döndürürüm?

Istenilen çıktı:

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

Yanıtlar:


101

Bir liste anlayışı ile .

[x[1] for x in L]

53
Bunun basit bir soru olduğunu anlıyorum. SO bu kadar elitist bir yer mi? Soruyu araştırmayı deneyin, sonuçlar ihtiyacım olan şey değil. Python öğrenmeyi zor yoldan yaptım ve bunu orada bulamadım. Daha önce Python öğrenmeye yönelik en iyi yaklaşım hakkında sorular sordum ve oybirliğiyle verilen cevap basit bir kitap alıp içeri dalmak. Bu beni sinirlendiriyor ve aradığım herhangi bir kitapta veya çevrimiçi materyalde çözümü bulamıyorum. şimdiye kadar? Ayrıca yorumunuz gerçekten yardımcı olmuyor ve yeni üyelerin SO'da paylaşım yapmasını engelliyor.
süper 9

1
@Nai: Python eğitimini okumanızı öneririm: docs.python.org/tutorial/index.html . Genel olarak dokümantasyon çok iyidir. Ve bazen, sadece denemek gerekir;)
Felix Kling

19
Bir tuple listesindeki bir öğeye erişmek amacıyla Google'da "tuple öğesindeki öğeye erişerek" araştırdım. Beni sorunuza getirdi, çok teşekkür ederim. Python'da oldukça yeniyim ve cevabı özellikle sezgisel bulmuyorum, ama bu sadece benim!
Patrick Williams

8
SO ile ilgili tüm konseptin sorularınıza cevap bulmayı kolaylaştırmak olduğunu düşündüm. Bir sorunun geçerli olması için neden belirli bir zorlukta olması gerekir? Güzel soru, güzel cevap.
Sceluswe

3
Parlak! Kısa, keskin, kısa, keskin, noktasal soruya nokta cevap. İkiniz de günümü kazandınız!
Eric M

82

Ignacio'nun cevabı, istediğiniz şeydir. Bununla birlikte, birisi Python da öğrenirken, onu sizin için incelemeye çalışayım ... Daha önce de belirtildiği gibi, bu bir liste anlayışıdır ( örneğin DiveIntoPython3'te ele alınmıştır ). İşte birkaç nokta:

[x[1] for x in L]

  • []Kod satırının etrafına dikkat edin . Bunlar bir listeyi tanımlar. Bu size bu kodun bir liste döndürdüğünü söyler, bu yüzden listtürünün bu. Bu nedenle, bu tekniğe "liste anlama" denir.
  • L sizin orijinal listenizdir. Yani L = [(1,2),(2,3),(4,5),(3,4),(6,7),(6,7),(3,8)]yukarıdaki kodu çalıştırmadan önce tanımlamalısınız .
  • xsadece anlamada var olan bir değişkendir - anlamanın xdışında erişmeye çalışın veya type(x)yukarıdaki satırı çalıştırdıktan sonra yazın ve size söyleyecektir NameError: name 'x' is not defined, oysa type(L)döner <class 'list'>.
  • x[1]işaret ikinci dizilerini her öğenin ise x[0]ilk öğelerin her işaret olacaktır.
  • Dolayısıyla, bu kod satırı kelimenin tam anlamıyla "L listesindeki tüm tuplelar için bir demetteki ikinci öğeyi döndür" okur

Soruyu sormadan önce sorunu ne kadar denediğini söylemek zor, ama belki de anlamaya aşina değildin? DiveIntoPython'un 3. Bölümünü veya anlamayla ilgili herhangi bir kaynağı okumak için biraz zaman harcardım . İyi şanslar.


4
2.x sürümünde, xLC'nin dışında, kendisine bağlı son değerle birlikte bulunacaktır. Bu, 3.x'te düzeltilmiştir.
Ignacio Vazquez-Abrams

Bunun farkında değildim. Bilgi için teşekkürler.
gary

4
Harika açıklama @gary. Özellikle L'nin kastettiği şeye dikkatinizi çekmenizi takdir ediyorum.
Patrick Williams

@PatrickWilliams geri bildiriminiz için teşekkürler. Bunun yardımcı olmasına sevindim. Sen de yapabilirsin [x[1] for x in [(1,2),(2,3),(4,5),(3,4),(6,7),(6,7),(3,8)]]ama bu gözler için o kadar kolay değil.
gary

5

Bunu yapmanın kesinlikle yolu bir listeyi anlamaktır. Daha hızlı olması gereken başka bir yol da mapve itemgetter.

import operator

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

OP'nin google'da bir cevap bulamadığı yorumuna yanıt olarak, bunu yapmanın süper saf bir yolunu göstereceğim.

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

Bu şunları kullanır:

  1. Bir değişkeni boş bir listeye başvuracak şekilde bildirmek.
  2. Bir for döngüsü.
  3. appendBir listedeki yöntemi çağırmak .

Bir kimse bir dil öğrenmeye çalışıyor ve bu temel parçaları kendileri için bir araya getiremiyorsa, o zaman onu bir alıştırma olarak görmeli ve yirmi saat sürse bile kendileri yapmalıdır.

İnsanın ne istediğini nasıl düşüneceğini öğrenmesi ve bunu mevcut araçlarla karşılaştırması gerekir . İkinci cevabımdaki her unsur, temel bir öğreticide ele alınmalıdır. Birini okumadan programlamayı öğrenemezsiniz .


2

Ayrıca, sırayla paket açmayı şunlarla da kullanabilirsiniz 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)

Bu ayrıca _, atılan ilk öğelerden bir demet oluşturur . Yalnızca ikinciyi çıkarmak mümkündür, ancak daha ayrıntılı:

from itertools import islice

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

2

VEYA şunları kullanabilirsiniz 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]
>>> 

Veya 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
Lütfen cevabınızı biraz açıklayın, böylece onu arayan diğerlerini daha kolay anlayabilirsiniz.
herrbischoff
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.