返回两个列表之间匹配的索引

时间:2019-08-22 10:10:19

标签: python match

假设我有以下列表:

input_1 = ['a', 'c', None, 'e']

input_2 = ['e', 'a', 'b', 'q', 'f']

我要输出以下列表:

output = [1, None, None, 0]

output的元素的索引input_2应该与input_1中的相应元素匹配。

如果元素是None中的input_1,则该元素不应与任何元素匹配,但相应索引/位置处的output应该直接为None

因此,如果用文字写出output,则应该是:

output = [index of 'a' in input_2, no match for 'c' , (by definition) no match for None, index of 'e' in input_2]

最有效的方法是什么?

4 个答案:

答案 0 :(得分:2)

您可以轻松地做到这一点,因为您创建了一个映射字典,该字典将包含列表input_2的元素作为键,并将其位置作为值

>>> mapping = {e:i for i,e in enumerate(input_2)}
>>> [mapping.get(e) for e in input_1]            
[1, None, None, 0]  

答案 1 :(得分:0)

input_1 = ['a', 'c', None, 'e']

input_2 = ['e', 'a', 'b', 'q']

output=[]
for x in input_1:
  if x in input_2:
    output.append(input_2.index(x))
  else:
    output.append(None)

print(output)

答案 2 :(得分:0)

我不确定这是否是最好的方法。我为input_2创建了一个字典,然后使用它来获得最终结果。总体复杂度为O(n + m)。这样,无需为每个项目找到索引:

dataDict = {}
for index, value in enumerate(input_2):
    dataDict[value] = index
result = [dataDict[d] if d and d in input_2 else None for d in input_1]
print(result)

答案 3 :(得分:0)

为了完善;
使用单个衬纸生成输出,列表理解

input_1 = ['a', 'c', None, 'e']
input_2 = ['e', 'a', 'b', 'q', 'f']

output = [
    input_2.index(x) if x in input_2 and x is not None else None
    for x
    in input_1
]

assert [1, None, None, 0] == output