2012-04-28 1031 views
10

对于两个列表a和b,如何获取两个列表中出现的值的索引?例如,比较python中的两个列表并返回匹配值的索引

a = [1, 2, 3, 4, 5] 
b = [9, 7, 6, 5, 1, 0] 

return_indices_of_a(a, b) 

将返回[0,4],与(a[0],a[4]) = (1,5)

+0

可能重复的[Python:如何查找列表交集?](http://stackoverflow.com/questions/3697432/python-how-to-find-list-intersection) – ChristopheD 2012-04-28 20:03:21

+2

我不认为这个问题是即使可能是相似的,也是该副本的副本。 – jamylak 2012-04-28 20:06:01

回答

18

要做到这一点,最好的方法是制作b a set,因为您只需检查其中的成员身份。

>>> a = [1, 2, 3, 4, 5] 
>>> b = set([9, 7, 6, 5, 1, 0]) 
>>> [i for i, item in enumerate(a) if item in b] 
[0, 4] 
+0

非常感谢!那么这种情况如何:'a = [1,2,9,8]'和'b = [1,9,1]'(b是a的子集),其中期望的结果是'[0,2,0 ]'(b中每个匹配值的索引)?使b集合将失去第二个'1'的索引以及索引的序列。 – user1342516 2012-04-30 14:01:12

+0

在这种情况下,它不会是'[0,2,0,1,2]“还是类似的东西? (因为'b'的所有项都出现在这两个列表中) – jamylak 2012-04-30 14:14:25

+0

我还没有清楚...在这种情况下,我需要的结果'indices'将给出'array(a)[indices] = b'。我编辑了这个问题。也许描述更清晰。 – user1342516 2012-04-30 14:25:58

5
def return_indices_of_a(a, b): 
    b_set = set(b) 
    return [i for i, v in enumerate(a) if v in b_set] 
2

对于较大的列表,这可能会有所帮助:

for item in a: 
index.append(bisect.bisect(b,item)) 
    idx = np.unique(index).tolist() 

一定要导入numpy的。

相关问题