假设我们有两个列表Python列表作为列表索引
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
环路(称它明确的代码)困扰?
假设我们有两个列表Python列表作为列表索引
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
环路(称它明确的代码)困扰?
一切都将使用循环内部* ,但它并没有成为像你想象的那么复杂。您可以尝试列表理解:
[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]
* OK!也许你不需要递归循环,但我认为这对于这样的事情来说肯定是矫枉过正的。
它使用一个循环。但是你不使用循环的要求是疯狂的。 –
@MartijnPieters一切将在其核心,使用一个循环。 – arshajii
@ A.R.S .:当然,numpy解决方案也在内部使用循环。正如我所说,所述的要求是无法实现的。 –
如果您使用numpy的,你可以做到以下几点:
list_A[list_B] // yields [1, 54, 4, 6]
编辑:正如尼克牛逼指出,不要忘记转换第一个阵列!
在执行此操作之前,应将列表转换为数组,对吗? – maheshakya
list_A应该是。 list_B不一定是。 'arr_A = np.array(list_A)' –
numpy可以以相当直接的方式与its indexing做到这一点。将列表转换为数组,那么你就是金。你可以传递任何类型的迭代作为索引。
>>> 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])
没有迭代/循环这里。只是递归。
>>> 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]
>>> 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
的要求。
稍有相关,如果你要去numpy路径:http://stackoverflow.com/questions/7002895/numpy-array-indexing –
这一切都取决于你的意思是'for-loop'。做这件事的显而易见的方式是有一个列表理解。 '[A [x] for B]'是否使用'for-loop'?也许。 'map(lambda i:list_A [i],list_B)'?看不到'for-loop',但'map'中有迭代。 numpy解决方案如何?没有迭代可见,但是... – hughdbrown