我想用这样的另一个列表索引一个列表
L = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
Idx = [0, 3, 7]
T = L[ Idx ]
T应该最终是一个包含['a','d','h']的列表。
有没有比这更好的方法
T = []
for i in Idx:
T.append(L[i])
print T
# Gives result ['a', 'd', 'h']
我想用这样的另一个列表索引一个列表
L = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
Idx = [0, 3, 7]
T = L[ Idx ]
T应该最终是一个包含['a','d','h']的列表。
有没有比这更好的方法
T = []
for i in Idx:
T.append(L[i])
print T
# Gives result ['a', 'd', 'h']
Answers:
T = [L[i] for i in 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')
...并且可能要快得多(如果性能足以影响numpy导入)
我对这些方法都不满意,所以我想出了一个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']
existing_list = Flexlist(existing_list)
我们有所需的功能没有打破任何代码