如果条件映射并附加到列表

时间:2017-08-10 10:53:26

标签: python dictionary if-statement append

是否有一种简单的方法可以使用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')]

4 个答案:

答案 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()