所以如果第一个和第二个值相等,我想在列表列表中添加元素的第三个值。如果没有,我希望将不相等的那些添加到我的总和列表中。
first=[[1,1,5],[2,3,7],[3,5,2],[4,4,6]]
second=[[1,1,3],[4,2,4],[2,3,2]]
sum=[]
for i in ((first)):
for j in ((second)):
if i[0]==j[0] and i[1]==j[1]:
sum.append([i[0],j[1],i[2]+j[2]])
print(sum)
所以这给了我[[1, 1, 8], [2, 3, 9]]
,但我也希望在我的[3,5,2],[4,4,6],[4,2,4]
列表中sum
。我怎么在pyhton中做到这一点?
答案 0 :(得分:1)
一种解决方案是使用标准库中的collections.defaultdict
。
我们的想法是将您的字典键设置为前2个元素的元组,然后按第三个元素递增。然后通过字典理解来聚合键和值。
first = [[1,1,5],[2,3,7],[3,5,2],[4,4,6]]
second = [[1,1,3],[4,2,4],[2,3,2]]
from collections import defaultdict
from itertools import chain
d = defaultdict(int)
for i, j, k in chain(first, second):
d[(i, j)] += k
res = [[*k, v] for k, v in d.items()]
print(res)
[[1, 1, 8], [2, 3, 9], [3, 5, 2], [4, 4, 6], [4, 2, 4]]
以下是不使用任何库的等效解决方案,使用dict.setdefault
:
d = {}
for i, j, k in first+second:
d.setdefault((i, j), 0)
d[(i, j)] += k
res = [[*k, v] for k, v in d.items()]
答案 1 :(得分:0)
我试图在没有字典或库的情况下这样做:
first = [[1,1,5],[2,3,7],[3,5,2],[4,4,6]]
second = [[1,1,3],[4,2,4],[2,3,2]]
checked = []
sum = []
for n_i, i in enumerate(first):
for n_j, j in enumerate(second):
if i[0]==j[0] and i[1]==j[1]:
sum.append([i[0],j[1],i[2]+j[2]])
checked.append([n_i,n_j]) # Save the used index
# Delete used index
[first.pop(i[0]) and second.pop(i[1]) for i in reversed(checked)]
# Append non-used index
[sum.append(first.pop(0)) for x in range(0,len(first))]
[sum.append(second.pop(0)) for x in range(0,len(second))]
print(sum)
返回:
[[1, 1, 8], [2, 3, 9], [3, 5, 2], [4, 4, 6], [4, 2, 4]]