是否有一种简单的方法可以使用map函数对以下示例进行编码?如果没有,怎么可以通过使用列表理解来完成?
lst1=['a','b','c']
lst2=['a','b','c','d']
l=[]
for iteml1 in lst1:
if iteml1 in lst2:
l.append((lst2.index(iteml1),iteml1))
l是一个向量,它包含lst2 list和lst2元素中lst1元素的索引。输出:
l
Out[1]: [(0,'a'),(1,'b'),(2,'c')]
答案 0 :(得分:2)
l = [(lst2.index(item), item) for item in lst1 if item in lst2]
答案 1 :(得分:2)
您可以从lst2
创建一个字典,将其项目映射到其索引,然后使用它来获取预期的输出。这将是O(N)
。
>>> indices = {x: i for i, x in enumerate(lst2)}
>>> [(indices[item], item) for item in lst1 if item in indices]
[(0, 'a'), (1, 'b'), (2, 'c')]
另一个选项是获取一个包含两个列表交集的集合,然后循环遍历lst2
并在该集合中进行查找:
>>> s = set(lst2).intersection(lst1)
>>> [(i, x) for i, x in enumerate(lst2) if x in s]
[(0, 'a'), (1, 'b'), (2, 'c')]
答案 2 :(得分:2)
根据列表的大小,您可能需要构建一个dict,将lst1
中的项目映射到其索引,以避免重复 O (n )list.index
查找和 O (n)每个项目的成员资格检查:
dct = dict((k, v) for v, k in enumerate(lst1))
l = [(dct[x], x) for x in lst1 if x in dct]
print(l)
# [(0, 'a'), (1, 'b'), (2, 'c')]
成员资格检查和__getitem__
表格都是在固定时间内完成的。
答案 3 :(得分:2)
使用地图:
dict(map(lambda x: (lst2.index(x), x), lst1))
输出
{0: 'a', 1: 'b', 2: 'c'}
表示dict的输出列表:
result.items()