我想索引與另一列表的列表這樣在Python中,如何使用另一個列表爲列表建立索引?
L = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
Idx = [0, 3, 7]
T = L[ Idx ]
和T應當最終被包含列表[「一個」,「d」,「H」]。
難道還有比
T = []
for i in Idx:
T.append(L[i])
print T
# Gives result ['a', 'd', 'h']
我想索引與另一列表的列表這樣在Python中,如何使用另一個列表爲列表建立索引?
L = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
Idx = [0, 3, 7]
T = L[ Idx ]
和T應當最終被包含列表[「一個」,「d」,「H」]。
難道還有比
T = []
for i in Idx:
T.append(L[i])
print T
# Gives result ['a', 'd', 'h']
T = [L[i] for i in Idx]
T = map(lambda i: L[i], Idx)
一個更好的方式。如果你正在使用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')
...而且可能要快得多(如果性能足以滿足麻煩的進口需求)
我並不快樂與任何一種方法,所以我想出了一個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']
L= {'a':'a','d':'d', 'h':'h'}
index= ['a','d','h']
for keys in index:
print(L[keys])
我會用一個Dict add
所需keys
到index
一種功能性方法:
a = [1,"A", 34, -123, "Hello", 12]
b = [0, 2, 5]
from operator import itemgetter
print(list(itemgetter(*b)(a)))
[1, 34, 12]
這是比一個for-loop更快還是更短? – 2009-06-18 11:44:55
@daniel:都推薦 – SilentGhost 2009-06-18 11:50:54
一個快速的時間測試(沒有pysco或任何東西,所以你會做什麼)顯示列表的理解速度比循環(1000個元素,重複10000次)快2.5倍。 – 2009-06-18 12:00:29