2013-03-30 90 views
1

假设我们有两个列表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环路(称它明确的代码)困扰?

+0

稍有相关,如果你要去numpy路径:http://stackoverflow.com/questions/7002895/numpy-array-indexing –

+0

这一切都取决于你的意思是'for-loop'。做这件事的显而易见的方式是有一个列表理解。 '[A [x] for B]'是否使用'for-loop'?也许。 'map(lambda i:list_A [i],list_B)'?看不到'for-loop',但'map'中有迭代。 numpy解决方案如何?没有迭代可见,但是... – hughdbrown

回答

6

一切都将使用循环内部* ,但它并没有成为像你想象的那么复杂。您可以尝试列表理解:

[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!也许你不需要递归循环,但我认为这对于这样的事情来说肯定是矫枉过正的。

+1

它使用一个循环。但是你不使用循环的要求是疯狂的。 –

+0

@MartijnPieters一切将在其核心,使用一个循环。 – arshajii

+0

@ A.R.S .:当然,numpy解决方案也在内部使用循环。正如我所说,所述的要求是无法实现的。 –

1

如果您使用numpy的,你可以做到以下几点:

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

编辑:正如尼克牛逼指出,不要忘记转换第一个阵列!

+0

在执行此操作之前,应将列表转换为数组,对吗? – maheshakya

+0

list_A应该是。 list_B不一定是。 'arr_A = np.array(list_A)' –

1

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]) 
1

递归答案

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

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

地图答案

>>> 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的要求。