2012-08-07 15 views
26

Python'da aList öğelerinin bir listesini ve myIndices dizinlerinin bir listesini görüyorum. aList'daki tüm öğeleri myIndices'daki değerleri indeks olarak almamın bir yolu var mı?Python: indekslere göre filtreleme listeleri

Örnek: bunu yapmak için herhangi bir yöntem bilmiyorum

>>> aList = ['a', 'b', 'c', 'd', 'e', 'f', 'g'] 
>>> myIndices = [0, 3, 4] 
>>> aList.A_FUNCTION(myIndices) 
['a', 'd', 'e'] 
+7

'[aLIST [i] i için myIndices içinde]' – Morwenn

+3

, onun yerine bir jeneratör ifadesini kullanmak önermek : '(myIndices in i için lList [i])' – hochl

cevap

9

Kesinlikle bir liste anlama kullanmak ama burada öyle bir fonksiyondur (list hiçbir yöntemler bunu o vardır). Ancak bu, itemgetter'un kötü kullanımıdır, ancak bunu paylaştığım bilgi uğruna.

>>> from operator import itemgetter 
>>> a_list = ['a', 'b', 'c', 'd', 'e', 'f', 'g'] 
>>> my_indices = [0, 3, 4] 
>>> itemgetter(*my_indices)(a_list) 
('a', 'd', 'e') 
+0

Bunun doğru bir durum olmadığını düşünüyorum. 'itemgetter'ı kullan. –

+0

@BasicWolf Evet, onu kullanmamalısınız, ancak OP bunu yapabilecek bir işlev istedi, bu yüzden ne olduğunu gösterdim. Bunu kullanmamanız gerektiğini daha açık bir şekilde yapacağım. – jamylak

+0

Sanırım bu, bir fonksiyonun sahip olabileceği maksimum argüman sayısı sınırı ile de sınırlı olacaktır. – Paddy3118

5

Listelere göre indeksleme, numpy ile yapılabilir. Bir numpy diziye baz listesini dönüştürme ve daha sonra bir indeks olarak başka bir liste geçerlidir: Eğer gerekiyorsa

>>> from numpy import array 
>>> array(aList)[myIndices] 
array(['a', 'd', 'e'], 
    dtype='|S1') 

, sonunda bir listeye geri dönüştürmek: Bazı durumlarda

>>> from numpy import array 
>>> a = array(aList)[myIndices] 
>>> list(a) 
['a', 'd', 'e'] 

bu çözüm olabilir liste anlamadan daha elverişli olmak.

1

Ben bu çözümleri ile mutlu değildi, bu yüzden sadece list sınıfını genişleten bir Flexlist sınıf oluşturduk ve tamsayı, dilim veya dizin-liste tarafından esnek endeksleme için izin verir: için,

class Flexlist(list): 
    def __getitem__(self, keys): 
     if isinstance(keys, (int, slice)): return list.__getitem__(self, keys) 
     return [self[k] for k in keys] 

Sonra senin örneğin sen bunu kullanabilirsiniz: Şunları kullanabilirsiniz

aList = Flexlist(['a', 'b', 'c', 'd', 'e', 'f', 'g']) 
myIndices = [0, 3, 4] 
vals = aList[myIndices] 

print(vals) # ['a', 'd', 'e'] 
+0

Bu oldukça kullanışlıdır. – mikeTronix

4

map

map(aList.__getitem__, myIndices) 

veya operator.itemgetter

f = operator.itemgetter(*aList) 
f(myIndices) 
2

tüm unsurlara eşzamanlı erişimi olan bir liste gerektirir, ama sadece iteratif alt listedeki tüm öğeleri kullanmak isteyen (ya da olacak bir şey onları geçmek) yoksa, onun yerine liste anlama daha jeneratör ifadesini kullanmak daha verimli: sadece elemanları üzerinde ilerlerken istiyorsanız

(aList[i] for i in myIndices) 
İlgili konular