python3 汇总列表列表中的元素
python3 summarize elements form list of lists
我有一个列表列表
lst = [[0,1],[1,1],[3,1],[1,2],[1,3],[3,5]]
我想为相等的第一项汇总子列表的第二项。结果应该看起来像
lst = [[0,1],[1,6],[3,6]]
我试过这样的事情:
lst=[[0, 0.25], [1, 0.125], [2, 0.0625], [3, 0.0625], [1, 0.125], [2, 0.0625], [3, 0.03125], [4, 0.03125]]
for listitem in range(len(lst)):
first=listitem[0]
second = 0
for obj in lst:
if obj[0] == first:
second += obj[1]
lst.remove(obj)
listitem[1] = second
另一种思考方式是,每对中的第一项是 key
,第二项是 value
——所以如果你创建一个 dict
,你然后可以在遇到每个键时将值加在一起——如果使用 defaultdict
:
会更容易
from collections import defaultdict
summary = defaultdict(int)
for sublist in lst:
key, value = sublist
summary[key] += value
print(summary.items())
summary[key] += value
行是这里的主力。它的作用:
- 总结一下
key
- 如果不存在则添加它并使用
int
创建默认值
- return 值(已经存在或新创建)
- 为其添加新值
- 将其存储回
key
下的 summary
使用默认字典
from collections import defaultdict
lst=[[0, 0.25], [1, 0.125], [2, 0.0625], [3, 0.0625], [1, 0.125], [2, 0.0625], [3, 0.03125], [4, 0.03125]]
res = defaultdict(int)
for el in lst:
res[el[0]] += el[1]
res_list = [[k,v] for (k,v) in res.items()]
print(res_list)
[[0, 0.25], [1, 0.25], [2, 0.125], [3, 0.09375], [4, 0.03125]]
groupby
returns 键和具有相同键的项目的迭代器。它必须传递一个按相同键排序的列表:
from itertools import groupby
from operator import itemgetter
lst = [[0,1],[1,1],[3,1],[1,2],[1,3],[3,5]]
result = [[k,sum(b for a,b in g)]
for k,g in groupby(sorted(lst),key=itemgetter(0))]
print(result)
输出:
[[0, 1], [1, 6], [3, 6]]
range(n)
生成一个列表,例如 [0,1,2...n-1]
,因此 listitem
的类型是 int
而不是 list
.
lst=[[0, 0.25], [1, 0.125], [2, 0.0625], [3, 0.0625], [1, 0.125], [2, 0.0625], [3, 0.03125], [4, 0.03125]]
for listitem in lst:
first = listitem[0]
second = 0
for obj in lst:
if obj[0] == first:
second += obj[1]
lst.remove(obj)
listitem[1] = second
我有一个列表列表
lst = [[0,1],[1,1],[3,1],[1,2],[1,3],[3,5]]
我想为相等的第一项汇总子列表的第二项。结果应该看起来像
lst = [[0,1],[1,6],[3,6]]
我试过这样的事情:
lst=[[0, 0.25], [1, 0.125], [2, 0.0625], [3, 0.0625], [1, 0.125], [2, 0.0625], [3, 0.03125], [4, 0.03125]]
for listitem in range(len(lst)):
first=listitem[0]
second = 0
for obj in lst:
if obj[0] == first:
second += obj[1]
lst.remove(obj)
listitem[1] = second
另一种思考方式是,每对中的第一项是 key
,第二项是 value
——所以如果你创建一个 dict
,你然后可以在遇到每个键时将值加在一起——如果使用 defaultdict
:
from collections import defaultdict
summary = defaultdict(int)
for sublist in lst:
key, value = sublist
summary[key] += value
print(summary.items())
summary[key] += value
行是这里的主力。它的作用:
- 总结一下
key
- 如果不存在则添加它并使用
int
创建默认值 - return 值(已经存在或新创建)
- 为其添加新值
- 将其存储回
key
下的
summary
使用默认字典
from collections import defaultdict
lst=[[0, 0.25], [1, 0.125], [2, 0.0625], [3, 0.0625], [1, 0.125], [2, 0.0625], [3, 0.03125], [4, 0.03125]]
res = defaultdict(int)
for el in lst:
res[el[0]] += el[1]
res_list = [[k,v] for (k,v) in res.items()]
print(res_list)
[[0, 0.25], [1, 0.25], [2, 0.125], [3, 0.09375], [4, 0.03125]]
groupby
returns 键和具有相同键的项目的迭代器。它必须传递一个按相同键排序的列表:
from itertools import groupby
from operator import itemgetter
lst = [[0,1],[1,1],[3,1],[1,2],[1,3],[3,5]]
result = [[k,sum(b for a,b in g)]
for k,g in groupby(sorted(lst),key=itemgetter(0))]
print(result)
输出:
[[0, 1], [1, 6], [3, 6]]
range(n)
生成一个列表,例如 [0,1,2...n-1]
,因此 listitem
的类型是 int
而不是 list
.
lst=[[0, 0.25], [1, 0.125], [2, 0.0625], [3, 0.0625], [1, 0.125], [2, 0.0625], [3, 0.03125], [4, 0.03125]]
for listitem in lst:
first = listitem[0]
second = 0
for obj in lst:
if obj[0] == first:
second += obj[1]
lst.remove(obj)
listitem[1] = second