簡體   English   中英

從元組列表中獲取交集

[英]Get intersection from list of tuples

我有兩個元組列表

a = [('head1','a'),('head2','b'),('head3','x'),('head4','z')]
b = [('head5','u'),('head6','w'),('head7','x'),('head8','y'),('head9','z')]

我想取每個元組的第二個元素的交集,例如 set {a[0][0],a[0][1],a[0][2],a[0][3]}與從列表ab設置{b[0][0],b[0][1],b[0][2],b[0][3],b[0][4]}使得它如果存在交集值,則返回元組的第一個元素映射。 結果輸出應如下所示:

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

這樣做的正確和最快的方法是什么?

您可以在 Python 3 中執行以下操作。從您的列表中創建字典,從兩個字典中獲取鍵的交集,在鍵處獲取相應的值:

>>> 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()

您可以將函數與生成器一起使用:

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM