![](/img/trans.png)
[英]Comparing two lists of tuples and finding the frequency of the common elements
[英]Comparing elements between elements in two lists of tuples
这是我想要做的。我有两个元组列表。 构建一个元素列表,使list1中元组中的第一个元素与列表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 [25]: l1 = [('a', 2), ('b', 3), ('z', 5)]
In [26]: l2 = [('a', 1), ('b', 2), ('c', 3)]
In [27]: [x[0] for x,y in zip(l1,l2) if x[0]==y[0]]
Out[27]: ['a', 'b']
编辑:阅读上面的评论后,看起来你正在寻找这样的东西:
In [36]: [x[0] for x in l1 if any(x[0]==y[0] for y in l2)]
Out[36]: ['a', 'b']
或使用sets
:
In [43]: from operator import itemgetter
In [44]: set(map(itemgetter(0),l1)) & set(map(itemgetter(0),l2))
Out[44]: set(['a', 'b'])
我想你想在这里使用set
:
set(x[0] for x in list1).intersection(y[0] for y in list2)
或使用语法糖:
{x[0] for x in list1} & {y[0] for y in list2}
这两个导致:
set(['a', 'b'])
我认为在这里使用集合可能更清楚(因为你没有重复的元素):
set1 = set( el[0] for el in list1 )
set2 = set( el[0] for el in list2 )
set3 = set1 & set2 # set intersection
# list3 = list(set3)
假设您想要元组的第一个元素的集合交集,您可以使用Python 2.7中引入的字典键视图:
dict(list1).viewkeys() & dict(list2).viewkeys()
这比长列表的解决方案更有效,因为它具有线性运行时(与解决方案的O(mn)相反),但以任意顺序返回结果(与list1
定义的顺序相反)。
在Python 3.x中,这将是
dict(list1).keys() & dict(list2).keys()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.