将列表中的元素映射到另一个列表中的索引

时间:2018-12-16 11:15:54

标签: python list indexing

我正在比较Python中的两个列表。

list1list2的超集。

对于list1的元素,我想要它们在list2中的索引(如果存在)。

这是两个例子。

list1 = ['a','b','c','d']
list2 = ['a','b']

解决方案应产生[0, 1]

list1 = ['a','b','c','d']
list2 = ['b','a']

解决方案应产生[1, 0]

我尝试了以下代码,但仅适用于第一个示例。

list1 = ['a','b','c','d']
list2 = ['a','b']

pairwise = zip(list1,list2)
matched_index = [idx for idx, pair in enumerate(pairwise) if pair[0] == pair[1]]

这有效。但是,对于第二组样本数据,我得到了错误的输出[]而不是预期的输出[1, 0]

list1 = ['a','b','c','d']
list2 = ['b','a']

pairwise = zip (list1,list2)
matched_index = [idx for idx, pair in enumerate(pairwise) if pair[0] == pair[1]]
print(matched_index) # prints []

请提出前进的方向。

3 个答案:

答案 0 :(得分:3)

我建议使用字典将list2的元素映射到它们的索引-假设list2具有唯一的元素。

>>> list1 = ['a','b','c','d']                                                                                            
>>> list2 = ['b','a']
>>> idx = {x:i for i,x in enumerate(list2)}                                                                            
>>> idx                                                                                                                
{'a': 1, 'b': 0}

现在您可以发布

>>> [idx[x] for x in list1 if x in idx]                                                                                
[1, 0]

答案 1 :(得分:1)

由于list2list1的子集,因此您可以构造字典映射,然后对dict.__getitem__的值使用list2来提取索引:

list1 = ['a','b','c','d']
list2 = ['a','b']
list3 = ['b','a']

d = {v: k for k, v in enumerate(list1)}

res1 = list(map(d.__getitem__, list2))  # [0, 1]
res2 = list(map(d.__getitem__, list3))  # [1, 0]

答案 2 :(得分:0)

假设每个列表和len(list1) >= len(list2)

中都有唯一的元素
>>> list1 = ['a','b','c','d']                                                                                            
>>> list2 = ['d','a', f]
>>> print([list2.index(x) for x in list1 if x in list2])