2016-03-24 20 views
2

Aşağıdaki liste var:çıkışı iç içe liste

a = [[0,11], [1,12], [3,14], [5,16],[7,18]] 

Ben

a[:,0] > 3 

satistying tüm unsurları alır yeni bir liste b oluşturmak ve a yılında endeksi başa eklemek istiyorum seçili yuvalanmış liste.

b = [[3, 5, 16],[4, 7,18]] 
ile

: endeksi ile

b = [points, points in a if points[0]>3] 

irade çıkışı b = [[5, 16],[7,18]] ve

b = [[index, points], index, points in enumerate(a) if points[0]>3] 

bir hata gösteriyor Yani b shoudl benziyor. Liste kavramasını kullanarak b'u nasıl oluşturabilirim?

Sen iç içe listeleri öğeleri tutmak için ıskarta değişkenlerin bir demet kullanabilirsiniz
+2

"a [:, 0]> 3" - Bu NumPy sözdizimi. NumPy kullanıyor musunuz? Listelerde ne var? – user2357112

+0

Gerçekten, numpy kullanıyorum. Benim uygulama için, aslında bir np.array, ama ben bir tür dizi veya liste olarak kullanmada herhangi bir fark görmedim, bu yüzden basitleştirme için yukarıda bir liste olarak bıraktım. – JMarc

+0

Verimlilik ve bir dizi operasyonun semantiği konusunda oldukça büyük farklılıklar vardır. NumPy kullanıyorsanız, NumPy dizileri için en iyi cevap genellikle listelerin en iyi yanıtından farklı olduğu için sorunuzda her zaman bunu açık bir şekilde belirtmelisiniz. – user2357112

cevap

3

:

>>> [[i,j,k] for i,(j,k) in enumerate(a) if j>3] 
[[3, 5, 16], [4, 7, 18]] 

Veya daha fazla öğe içeren listelere için daha kapsamlı bir yaklaşım olarak aşağıdaki liste anlama kullanabilirsiniz:

>>> [[i] + points for i, points in enumerate(a) if points[0]>3] 
[[3, 5, 16], [4, 7, 18]] 

Python 3 versiyonu kullanılarak açma atama: Eh

>>> [[i, first] + rest for i,(first, *rest) in enumerate(a) if first>3] 
[[3, 5, 16], [4, 7, 18]] 
+1

Teşekkür ederim. 2. yaklaşım çok zariftir (noktalara j, k. – JMarc

0

map(lambda y: [y[0]] + y[1], filter(lambda x: x[1][0] > 3, enumerate(a)))

1

a Eğer (öyle görünüyor ki bir NumPy dizidir: Ben işte o (oldukça şifreli hala liste comprehensions olmadan ama) yapmak için başka bir yol, bu soruyu ama benden önce yayınlanan diğer insanları yanıtlayan başladı

# One of the rare cases when numpy.where isn't superfluous. 
indices = numpy.where(a[:, 0] > 3)[0] 

index_column = indices[:, None] 
selected_rows = a[indices] 

b = numpy.hstack([index_column, selected_rows]) 

Veya daha az ara değişkenlerle:

indices = numpy.where(a[:, 0] > 3)[0] 
b = numpy.hstack([indices[:, None], a[indices]]) 
) gerçek kullanım durumunda olması, aşağıdakileri yapabileceğini

Büyük boyutlarda a, bu muhtemelen enumerate veya diğer Python düzeyinde yineleme tekniklerine dayanan çözümleri daha iyi performans gösterecektir.

+0

Teşekkürler 'kullanıcı2357112', çok iyi çalışıyor (Not, bir ']' son satırında eksiktir). BTW, bu yazının kapsamı dışında olabilir: ancak yerleşik bir fonksiyonun yinelemeyi kullanıp kullanmadığını belirleme. Numaralandırma durumunda barizdir, ancak np.where() öğesinin yinelenen olmadığını nereden biliyorsunuz? – JMarc

+0

@JMarc: Yazım hatası düzeltildi. np.where iteratiftir, ancak Python bayt kodu yorumlaması veya Python yineleyici protokolünün üstünden geçmez. Genel olarak, kodunuzda 'for' kelimesini görürseniz, kodunuzun o kısmı Python düzeyinde yineleme kullanır. NumPy dizilerini girdi olarak verilen NumPy rutinleri genellikle bu yükü atlar. – user2357112