映射 if 条件并追加到列表



有没有一种简单的方法可以使用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 列表和 LST2 元素中 LST1 元素的索引。 输出:

l
Out[1]: [(0,'a'),(1,'b'),(2,'c')]

根据列表的大小,您可能需要构建一个字典,将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__都是在恒定时间内完成的。

l = [(lst2.index(item), item) for item in lst1 if item in lst2]

使用地图:

dict(map(lambda x: (lst2.index(x), x), lst1))

输出

{0: 'a', 1: 'b', 2: 'c'}

对于字典的输出列表:

result.items()

您可以从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')]

最新更新