我有两个元组列表
a = [('head1','a'),('head2','b'),('head3','x'),('head4','z')]
b = [('head5','u'),('head6','w'),('head7','x'),('head8','y'),('head9','z')]
我想取每个元组的第二个元素的交集,例如设置{a[0][0],a[0][1],a[0][2],a[0][3]}
与列表{b[0][0],b[0][1],b[0][2],b[0][3],b[0][4]}
和a
中的集合b
的交集,以便它返回第一个元素如果存在交集值,则元组的元素映射。结果输出应如下所示:
res = [('head3','head7'),('head4','head9')]
到目前为止,我已经尝试过这个:
x = [(a[i][0],b[j][0]) for i in range(len(a)) for j in range(len(b)) if a[0][i] == b[0][j]]
但收到错误IndexError: tuple index out of range
这样做的正确和最快的方法是什么?
答案 0 :(得分:4)
您可以在Python 3中执行以下操作。从列表中创建dicts,从两个dicts中获取键,从键中获取相应的值:
>>> da = {k:v for v, k in a}
>>> db = {k:v for v, k in b}
>>> [(da[k], db[k]) for k in da.keys()&db.keys()]
[('head4', 'head9'), ('head3', 'head7')]
在Python 2中,您可以使用set(da).intersection(db)
代替da.keys()&db.keys()
。
答案 1 :(得分:2)
您可以将函数与生成器一起使用:
awk
输出:
def pairs():
a = [('head1','a'),('head2','b'),('head3','x'),('head4','z')]
b = [('head5','u'),('head6','w'),('head7','x'),('head8','y'),('head9','z')]
for val1, val2 in a:
for val3, val4 in b:
if val2 == val4:
yield (val1, val3)
print(list(pairs()))
答案 2 :(得分:0)
您还可以像这样使用列表理解
a = [('head1','a'),('head2','b'),('head3','x'),('head4','z')]
b = [('head5','u'),('head6','w'),('head7','x'),('head8','y'),('head9','z')]
pairs = [(val1,val3) for val1,val2 in a for val3,val4 in b if val2 == val4]
print(pairs)