2010-01-14 28 views
5

en ı çok boyutlu bir liste l var diyelim belirli sütununda belirli bir değer ile satır gösterme:Filtre düzeni

l = [['a', 1],['b', 2],['c', 3],['a', 4]] 

ve ben 'bir' içinde olduğunu sadece sıra kapsayan başka bir liste dönmek istiyorum ilk liste öğeleri:

m = [['a', 1],['a', 4]] 

Bunu yapmanın iyi ve verimli bir yolu nedir?

m = filter(lambda x: x[0] == 'a', l) 

veya bir liste anlama olarak

:

m = [x for x in l where x[0] == 'a'] 

cevap

11

bir liste anlama için bir vaka:

m = [row for row in l if 'a' in row[0]] 
İşte

Ben in operatörün kullanımına nereden kelimenin tam anlamıyla "sahip 'a' ilk elemanı", götürüyorum. Eğer "sahip 'a' olarak birinci elemanın" (! gerçekte yazdıklarını çok farklı bir şey -) bu kısıtlamak istiyorsanız,

m = [row for row in l if 'a' == row[0]] 

;-) demek daha doğru olur.

1
m = [i for i in l if i[0] == 'a'] 
0

m = filter(lambda x: x[0] == 'a', l) 

Bunların arasındaki fark, performans açısından önemli olacaktır. En uygun olanı kullanın. lambda s'yi sevmiyorum, ancak filter, daha büyük listeler için 10 ile değiştirilebilir, eğer bu bir sorun ise, aynı genel sonucu elde etmek için liste kavramasını bir jeneratörü ([] - () olarak değiştirin) de değiştirebilirsiniz. Bunun dışında muhtemelen aynıdırlar.

0

sadece nesi var:

m = [i for i in l if i[0] == 'a'] 

Veya: filter fonksiyonu ile