2

假设我们有两个列表

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循环(在代码中显式调用它)?

4

5 回答 5

8

一切都将在内部使用循环*,但它不必像您想象的那么复杂。您可以尝试列表理解:

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

*好的!也许你不需要递归循环,但我认为这样的事情肯定是矫枉过正。

于 2013-03-30T17:00:17.200 回答
3

递归答案

这里没有迭代/循环。只是递归。

>>> 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]
于 2013-03-30T17:11:31.050 回答
2

如果您使用的是 numpy,则可以执行以下操作:

list_A[list_B]  // yields [1, 54, 4, 6]

编辑:正如尼克 T 指出的,不要忘记先转换为数组!

于 2013-03-30T17:00:28.340 回答
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.

于 2013-03-30T17:25:04.100 回答
1

Numpy 可以通过其索引以一种相当直接的方式做到这一点。将列表转换为数组,然后你就是黄金。您可以将任何类型的可迭代作为索引传递。

>>> 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])
于 2013-03-30T17:00:43.967 回答