[英]merging/joining list of tuples in python
我有 2 個元組列表
a = [(123, 0, 1), (245, 0, 1)]
b = [(123, 1, 0), (678, 1, 0)]
我想以這樣的方式合並這兩個列表,我的輸出是:
merged_list = [(123, 1, 1), (245, 0, 1), (678, 1,0)]
我找到了這段代碼
def inner_join(a, b):
L = a + b
L.sort(key=itemgetter(0)) # sort by the first column
for _, group in groupby(L, itemgetter(0)):
row_a, row_b = next(group), next(group, None)
if row_b is not None: # join
yield row_a + row_b[1:]
當我執行這個時,它返回給我第一個元素是公共的元組
result = list(inner_join(a,b))
result - [(123,1,1)]
我該如何解決這個問題,以便我能夠獲得所需的解決方案
[(123, 1, 1), (245, 0, 1), (678, 1,0)]
您可以使用itertools.groupby
根據元組的第一個值對相似元素進行分組。
a = [(123, 0, 1), (245, 0, 1)]
b = [(123, 1, 0), (678, 1, 0)]
from itertools import groupby
grouped_list = [(k,list(g)) for k,g in groupby(sorted([*a,*b]),key= lambda x: x[0])]
這將為您提供如下輸出:
[(123, [(123, 0, 1), (123, 1, 0)]), (245, [(245, 0, 1)]), (678, [(678, 1, 0)])]
接下來我們需要對分組列表中元組的第二個和第三個值求和以獲得所需的輸出。
out = [(k,*[sum(x) for x in zip(*x)][1:]) for k,x in grouped_list]
這將為您提供所需的輸出
[(123, 1, 1), (245, 0, 1), (678, 1, 0)]
如果您更喜歡單線:
[(k,*[sum(x) for x in zip(*list(g))][1:]) for k,g in itertools.groupby(sorted([*a,*b]),key=lambda x: x[0])]
聽起來您想使用每個元組的第一個值作為鍵,在這種情況下,將元組 a 更改為字典可能更實用。 我相信有更好的方法,但你可以試試這個。 代替
a = [(123, 0, 1), (245, 0, 1)]
嘗試
a_dic = {123: (0,1), 245: (0,1)}
然后,您可以根據字典中的鍵檢查 b(元組列表)。 如果未找到匹配項,則將新鍵和值添加到字典中。 如果鍵匹配,則添加其值。
for x in b:
temp_tuple = x[1], x[2]
if not x[0] in a_dic.keys():
a_dic.update({x[0]: temp_tuple})
else:
new_value = tuple(map(sum,zip(temp_tuple, a_dic.get(x[0]))))
a_dic.update({x[0]:new_value})
print(a_dic)
結果是:
{123: (1, 1), 245: (0, 1), 678: (1, 0)}
看一下這個。 這是工作。 您可以根據需要更改/調整代碼。 希望代碼足夠簡單易懂。
a = [(123, 0, 1), (245, 0, 1)]
b = [(123, 1, 0), (678, 1, 0)]
# print (a)
# print (b)
c1=[]
c=[]
for element1 in b:
c1.append(element1)
for element2 in a:
if element1[0]==element2[0]:
x=(element1[0],element1[1]+element2[1],element1[2]+element2[2])
c.append(x)
for element2 in a:
c1.append(element2)
for element in c1:
flag=0
for element1 in c:
if element1[0]==element[0]:
flag=1
if (flag==0):
c.append(element)
print(c)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.