Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从元组列表中获取交集_Python_List_Mapping_Tuples - Fatal编程技术网

Python 从元组列表中获取交集

Python 从元组列表中获取交集,python,list,mapping,tuples,Python,List,Mapping,Tuples,我有两个元组列表 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 = [('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]}
的交集
{b[code>,如果存在交集值,它将返回元组的第一个元素映射。结果输出应如下所示:

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]]
但是得到一个错误
索引器:元组索引超出范围


正确且最快的方法是什么?

您可以在Python 3中执行以下操作。从列表中创建dict,从两个dict中获取键的交集,在键处获取相应的值:

>>> 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')]

在Python2中,可以使用
set(da).intersection(db)
代替
da.keys()&db.keys()

您可以将函数与生成器一起使用:

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()))
输出:

[('head3', 'head7'), ('head4', 'head9')]

您也可以使用这样的列表理解

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)

“我想取每个元组的第二个元素的交集”您的示例没有指出这一点。