我正在比较Python中的两个列表。
list1
是list2
的超集。
对于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 []
请提出前进的方向。
答案 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)
由于list2
是list1
的子集,因此您可以构造字典映射,然后对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])