2009-06-18 140 views

回答

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

這是比一個for-loop更快還是更短? – 2009-06-18 11:44:55

+4

@daniel:都推薦 – SilentGhost 2009-06-18 11:50:54

+7

一個快速的時間測試(沒有pysco或任何東西,所以你會做什麼)顯示列表的理解速度比循環(1000個元素,重複10000次)快2.5倍。 – 2009-06-18 12:00:29

6
T = map(lambda i: L[i], Idx) 
25

一個更好的方式。如果你正在使用numpy的,你可以這樣進行擴展切片:

>>> 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') 

...而且可能要快得多(如果性能足以滿足麻煩的進口需求)

3

我並不快樂與任何一種方法,所以我想出了一個Flexlist類,允許靈活的索引,無論是整數,切片或索引列表:

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

其中,對於你的榜樣,你會使用如:

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]) 

我會用一個Dict add所需keysindex

5

一種功能性方法:

a = [1,"A", 34, -123, "Hello", 12] 
b = [0, 2, 5] 

from operator import itemgetter 

print(list(itemgetter(*b)(a))) 
[1, 34, 12] 
相關問題