假设我们有两个列表
list_A = [1,3,4,54,3,5,6,2,6,77,73,39]
list_B = [0,3,2,8]
我想访问list_A
中list_B
的值作为索引的元素(不使用循环)。
实施后,上述情况的结果如下:
[1, 54, 4, 6]
有没有简单的方法可以做到这一点而不必费心for
循环(在代码中明确地调用它)?
答案 0 :(得分:7)
一切都将在内部使用循环* ,但它不必像您想象的那么复杂。您可以尝试列表理解:
[list_A[i] for i in list_B]
或者,您可以使用operator.itemgetter
:
list(operator.itemgetter(*list_B)(list_A))
>>> import operator
>>> list_A = [1,3,4,54,3,5,6,2,6,77,73,39]
>>> list_B = [0,3,2,8]
>>> [list_A[i] for i in list_B]
[1, 54, 4, 6]
>>> list(operator.itemgetter(*list_B)(list_A))
[1, 54, 4, 6]
* 好的!也许你不需要一个带递归的循环,但我认为这对于这样的东西来说肯定是过度杀伤。
答案 1 :(得分:2)
这里没有迭代/循环。只是递归。
>>> list_A = [1,3,4,54,3,5,6,2,6,77,73,39]
>>> list_B = [0,3,2,8]
>>> def foo(src, indexer):
... if not indexer:
... return []
... else:
... left, right = indexer[0], indexer[1:]
... return [src[left]] + foo(src, right)
...
>>> foo(list_A, list_B)
[1, 54, 4, 6]
答案 2 :(得分:2)
>>> list_A = [1,3,4,54,3,5,6,2,6,77,73,39]
>>> list_B = [0,3,2,8]
>>> map(lambda i: list_A[i], list_B)
[1, 54, 4, 6]
我认为这在技术上不符合没有for-loop
。
答案 3 :(得分:1)
如果您正在使用numpy,则可以执行以下操作:
list_A[list_B] // yields [1, 54, 4, 6]
编辑:正如Nick T指出的那样,不要忘记先转换为阵列!
答案 4 :(得分:1)
Numpy可以用its indexing以相当直接的方式做到这一点。将列表转换为数组然后你就是黄金。您可以将任何类型的iterable作为索引传递。
>>> import numpy
>>> list_A = [1,3,4,54,3,5,6,2,6,77,73,39]
>>> list_B = [0,3,2,8]
>>> numpy.array(list_A)[list_B]
array([ 1, 54, 4, 6])