Python 比较两个元组列表中元素之间的元素

Python 比较两个元组列表中元素之间的元素,python,Python,下面是我要做的。我有两个元组列表。构建元素列表,使列表1中元组中的第一个元素与列表2中元组中的第一个元素匹配 list1 = [('a', 2), ('b', 3), ('z', 5)] list2 = [('a', 1), ('b', 2), ('c', 3)] list3 = ['a','b'] 注意:不能有重复的第一个元素 在看了python列表理解之后,这就是我所做的 [x[0] for x in list1 if (x[0] in [y[0] for y in list2])]

下面是我要做的。我有两个元组列表。构建元素列表,使列表1中元组中的第一个元素与列表2中元组中的第一个元素匹配

list1 = [('a', 2), ('b', 3), ('z', 5)]

list2 = [('a', 1), ('b', 2), ('c', 3)]

list3 = ['a','b']
注意:不能有重复的第一个元素

在看了python列表理解之后,这就是我所做的

[x[0] for x in list1 if (x[0] in [y[0] for y in list2])]
我的问题是,一个有经验的python程序员会如何编写代码?我自己编好代码后,仍然觉得很难读懂。如果不是,你会怎么做呢?我会使用
zip()

编辑:在阅读了上面的评论后,您似乎正在寻找类似以下内容:

In [36]: [x[0] for x in l1 if any(x[0]==y[0] for y in l2)]
Out[36]: ['a', 'b']
或使用
集合

In [43]: from operator import itemgetter

In [44]: set(map(itemgetter(0),l1)) & set(map(itemgetter(0),l2))
Out[44]: set(['a', 'b'])
我想你应该在这里使用s:

或者使用语法糖:

{x[0] for x in list1} & {y[0] for y in list2}
这两种情况都会导致:

set(['a', 'b'])

我认为在这里使用集合可能更清晰(因为您没有重复的元素):


假设需要元组的第一个元素的集合交集,可以使用Python 2.7中介绍的字典键视图:

dict(list1).viewkeys() & dict(list2).viewkeys()
对于长列表,这将比您的解决方案更有效,因为它具有线性运行时(与解决方案的O(mn)相反),但会以任意顺序返回结果(与
list1
定义的顺序相反)

在Python3.x中,这将是

dict(list1).keys() & dict(list2).keys()

该死!比我快30秒。注意:将通过在列表理解之外添加
zip
来提高性能,这样就不会每隔一天重新计算
zip
time@inspectorG4dget我想
zip()
只调用了一次,看看字节码。啊,谢谢,如果列表的长度不相等,要想让这项功能发挥作用,请@sidg11查看
itertools.izip_longest()
@AshwiniChaudhary:我也这么认为,但我建议使用集合来避免二次运行时。是否应该
['a','b','c']
['a','c']
匹配
'c'
?我想说是的,最终的列表是['a','c',],但在我的示例中,我特别关注元组列表,您能解释一下“元组”是什么吗?我一个字也听不懂你说你想完成什么。。。
set1 = set( el[0] for el in list1 )
set2 = set( el[0] for el in list2 )
set3 = set1 & set2 # set intersection
# list3 = list(set3)
dict(list1).viewkeys() & dict(list2).viewkeys()
dict(list1).keys() & dict(list2).keys()