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

问题描述 投票:0回答:5

我有一个列表和一组:

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)

但是,这是给给我一个不正确的输出。

python
5个回答
1
投票

你是在正确的轨道上!所有你需要做的就是翻转你的循环顺序。对于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为理念的第二个解决方案。


4
投票

厚积薄发使用字典的数字,然后收集使用列表理解的结果:

>>> 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]]

2
投票

使用了分组的​​字典:

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]]

0
投票

这仅适用于在查找定义的项目返回款项。

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]]


0
投票
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)
© www.soinside.com 2019 - 2024. All rights reserved.