在Python中使用dict()组合/分组值



假设我有一个这样的列表:

t = [[datetime.datetime(2015, 6, 20, 0, 0), 0],
 [datetime.datetime(2015, 6, 20, 0, 0), 43],
 [datetime.datetime(2015, 6, 20, 0, 0), 24],
 [datetime.datetime(2015, 6, 20, 0, 0), 145],
 [datetime.datetime(2015, 6, 20, 0, 0), 249],
 [datetime.datetime(2015, 6, 20, 0, 0), 347],
 [datetime.datetime(2015, 6, 21, 0, 0), 191],
 [datetime.datetime(2015, 6, 21, 0, 0), 46],
 [datetime.datetime(2015, 6, 21, 0, 0), 19],
 [datetime.datetime(2015, 6, 21, 0, 0), 88],
 [datetime.datetime(2015, 6, 21, 0, 0), 181],
 [datetime.datetime(2015, 6, 21, 0, 0), 250]]

我想按列表中的第一个项目将它们组合在一起,这样我就有了(以列表或dict形式都可以,我可以将其中一个转换为另一个):

t = [datetime.datetime(2015, 6, 20, 0, 0), 750],
    [datetime.datetime(2015, 6, 21, 0, 0), 576]]

我尝试对组执行newdict = dict(t),但newdict只是返回列表中的最后一个值,这不是我想要的。

newdict = {datetime.datetime(2015, 6, 20, 0, 0): 347,
 datetime.datetime(2015, 6, 21, 0, 0): 250}

我想把相同datetime.datetime的值加起来。

欢迎任何建议-谢谢!

您可以使用itertools.groupby,您可以使用第一个元素对列表进行分组,然后在分组的列表中迭代,将第二个元素相加。

示例-

>>> from itertools import groupby
>>> import datetime
>>>
>>> t = [[datetime.datetime(2015, 6, 20, 0, 0), 0],
...  [datetime.datetime(2015, 6, 20, 0, 0), 43],
...  [datetime.datetime(2015, 6, 20, 0, 0), 24],
...  [datetime.datetime(2015, 6, 20, 0, 0), 145],
...  [datetime.datetime(2015, 6, 20, 0, 0), 249],
...  [datetime.datetime(2015, 6, 20, 0, 0), 347],
...  [datetime.datetime(2015, 6, 21, 0, 0), 191],
...  [datetime.datetime(2015, 6, 21, 0, 0), 46],
...  [datetime.datetime(2015, 6, 21, 0, 0), 19],
...  [datetime.datetime(2015, 6, 21, 0, 0), 88],
...  [datetime.datetime(2015, 6, 21, 0, 0), 181],
...  [datetime.datetime(2015, 6, 21, 0, 0), 250]]
>>> x = groupby(t, lambda x1: x1[0])
>>> newt = []
>>> for y, z in x:
...     l1 = []
...     for a in z:
...             l1.append(a[1])
...     newt.append([y,sum(l1)])
...
>>> newt
[[datetime.datetime(2015, 6, 20, 0, 0), 808], [datetime.datetime(2015, 6, 21, 0, 0), 775]]

带有groupby():的单行代码

list((k, sum(x[1] for x in g)) for k, g in groupby(sorted(t), lambda x: x[0]))

使用dict计数:

count_dict = {}
for key, value in t:
    count_dict[key] = count_dict.get(key, 0) + value

defaultdict:

from collections import defaultdict
count_dict = defaultdict(int)
for key, value in t:
    count_dict[key] += value
d = {}
for el in t:
    if el[0] not in d:
        d[el[0]] = el[1]
    else:
        d[el[0]] += el[1]
print(d)

最新更新