我有一个清单和一套:
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)
但这给了我一个错误的输出。
答案 0 :(得分: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]]
答案 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]]
答案 2 :(得分: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提出的第二个解决方案。
答案 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)
答案 4 :(得分:0)
这仅返回在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]]