假设我有以下列表:
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]
最有效的方法是什么?
答案 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