[英]Python summing values in list if it exists in another list
我有一個清單和一套:
a_list = [['1', 2], ['2', 1], ['1', 1]]
b_list = {'1', '2'}
我正在尋找與b_list中的項目相對應並從a_list中求和它們的值,以便輸出為:
[['1', 3], ['2', 1]]
我嘗試過的...
sum = 0
for i in a_list:
for j in b_list:
if i[0] in j:
sum += i[1]
print(j, sum)
但這給了我錯誤的輸出。
使用字典來累加數字,然后使用列表推導來收集結果:
>>> d = dict.fromkeys(b_list, 0)
>>> for k, n in a_list:
... if k in d:
... d[k] += n
...
>>> [[k, n] for k, n in d.items()]
[['1', 3], ['2', 1]]
使用字典進行分組:
d = {}
for k, v in a_list:
d[k] = d.get(k, 0) + v
print([[k, d[k]] for k in b_list])
印刷品:
[['2', 1], ['1', 3]]
您在正確的軌道上! 您要做的就是翻轉循環順序。 對於b_list
每個值,您希望對a_list
所有匹配值求和,因此b_list
應該是外部循環,而a_list
應該是內部循環。 還要注意,您的sum
變量應該在第一個循環內,因為b_list
每個值都不同。
如果進行此更改,您的代碼將按預期工作:
a_list = [['1', 2], ['2', 1], ['1', 1]]
b_list = {'1', '2'}
for j in b_list:
sum = 0
for i in a_list:
if i[0] == j:
sum += i[1]
print(j, sum)
將給出您想要的輸出:
('1', 3)
('2', 1)
編輯 :上面的解決方案是對問題中發布的代碼的最小修復,但是有更有效的解決方案:
與wim的答案類似,您可以使用defaultdictionary ,在這種情況下,它(使用)比使用內置的dict
類要有效(略):
from collections import defaultdict
#
a_list = [['1', 2], ['2', 1], ['1', 1]]
b_list = {'1', '2'}
dict = defaultdict(int)
for key, val in a_list:
if key in b_list:
dict[key] += val
print([[key, dict[key]] for key in b_list])
**感謝Coldspeed提出的第二個解決方案。
In [1]: a_list = [['1', 2], ['2', 1], ['1', 1]]
...:
...: b_list = {'1', '2'}
In [2]: out = [[i, sum(j[1] for j in a_list if j[0] == i)] for i in b_list]
In [3]: out
Out[3]: [['1', 3], ['2', 1]]
您可以使用列表總和,也可以直接調用總和。 這是兩種方法的時間表現:
In [6]: %timeit [[i, sum(j[1] for j in a_list if j[0] == i)] for i in b_list]
1.31 µs ± 2.52 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
In [7]: %timeit [[i, sum([j[1] for j in a_list if j[0] == i])] for i in b_list]
1.2 µs ± 1.67 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
僅返回在find中定義的項目的總和。
items = [['1', 2], ['2', 1], ['1', 1], ['3',1]]
find = {'1', '2'}
results = {}
for item in items:
key = item[0]
value = item[1]
if key in find:
results[key] = results.get(key,0) + value
[[key, value] for key, value in results.items()]
輸出[['2', 1], ['1', 3]]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.