6

这是我想要做的。我有两个元组列表。构建一个元素列表,使得 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 程序员如何编写代码吗?自己编写了代码后,我仍然觉得这很难阅读。如果不是,你会怎么做

4

4 回答 4

9

我会使用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'])
于 2012-10-31T22:18:30.840 回答
3

我想你想在set这里使用 s :

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'])
于 2012-10-31T22:26:46.747 回答
2

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

set1 = set( el[0] for el in list1 )
set2 = set( el[0] for el in list2 )
set3 = set1 & set2 # set intersection
# list3 = list(set3)
于 2012-10-31T22:27:51.167 回答
1

假设您想要元组的第一个元素的集合交集,您可以使用 Python 2.7 中引入的字典键视图:

dict(list1).viewkeys() & dict(list2).viewkeys()

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

在 Python 3.x 中,这将是

dict(list1).keys() & dict(list2).keys()
于 2012-10-31T22:30:31.340 回答