繁体   English   中英

Python求和列表中的值(如果它存在于另一个列表中)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM