2009-06-18 7 views
56

BuPython'da, bir listeyi başka bir listeyle nasıl dizinlerim?

L = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'] 
Idx = [0, 3, 7] 
T = L[ Idx ] 

gibi indeksine bir listesini içeren bir listeyi istiyorum ve T içeren bir liste [ 'a', 'd', 'h'] olarak sona gerekir.

sen numpy kullanıyorsanız, böyle genişletilmiş dilimleme gerçekleştirebilir

T = [] 
for i in Idx: 
    T.append(L[i]) 

print T 
# Gives result ['a', 'd', 'h'] 

cevap

135
T = [L[i] for i in Idx] 
+1

Bu, bir döngüden daha mı hızlı mı yoksa yalnızca daha kısa mı? –

+4

@daniel: hem + önerilir – SilentGhost

+7

Hızlı bir zamanlama testi (pysco veya başka bir şey, bu yüzden ne yaparsanız yapın) liste kavramasını döngüden 2.5 kat daha hızlı gösterdi (1000 eleman, tekrarlanan 10000 kere). –

25

daha iyi bir yolu var mı:

>>> import numpy 
>>> a=numpy.array(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']) 
>>> Idx = [0, 3, 7] 
>>> a[Idx] 
array(['a', 'd', 'h'], 
     dtype='|S1') 

... ve muhtemelen çok daha hızlı (eğer performans numpy ithalatı ile uğraşmak için yeterli ise)

+1

'da listeye dönüştürülmesi gerekiyordu Hızlı zaman adımı testim np.array öğesinin kullanılmasının neredeyse 3 kat daha yavaş olduğunu gösterdi (diziye dönüştürme dahil). –

3

Ben bu yaklaşımların herhangi biriyle mutlu değildi, bu yüzden her iki tamsayı, dilim veya dizin listesine göre, esnek endeksleme için izin veren bir Flexlist sınıfa geldi:

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

hangisi, senin örneğin,

L = Flexlist(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']) 
Idx = [0, 3, 7] 
T = L[ Idx ] 

print(T) # ['a', 'd', 'h'] 
1
L= {'a':'a','d':'d', 'h':'h'} 
index= ['a','d','h'] 
for keys in index: 
    print(L[keys]) 

Ben Dict addindex

5
için keys istenen kullanırsınız: siz kullanırsınızİşlevsel bir yaklaşım:
a = [1,"A", 34, -123, "Hello", 12] 
b = [0, 2, 5] 

from operator import itemgetter 

print(list(itemgetter(*b)(a))) 
[1, 34, 12]