项目更改时,在嵌套列表中对值求和

时间:2015-03-06 08:57:46

标签: python

我有一些问题困扰了我的初学者对python的了解,我希望有人可以指出我正确的方向。

我生成了一个嵌套列表,每个嵌套列表包含两个(对不起,伙计,我的错!)值,如:

[[1, 0],[1, 2],[2, 9],[3, 0],[3, 8],[3, 1]]

第一个值总是指定一天,第二个值总是我实际感兴趣的值。但我需要总结在给定日期发生的所有这些第二个值,如: 例如第1天0 + 2,第2天9,第3天0 + 8 + 1

并生成一个实际上看起来像[[1,2][2,9][3,9]]的列表,每个第一个值给出我总结的日期,第二个值作为当天所有值的总和。

我知道这是一个非常基本的问题,我知道如何解决这个问题。 gawk或fortran,但我想学习如何以pythonic的方式做到这一点。我查看了使用zip / map但我不知道如何为这个特定问题设置它。我希望有人可以指出我正确的方向

5 个答案:

答案 0 :(得分:2)

您可以将密钥放在字典中并将计数存储在值中。像这样:

#!/usr/bin/python
# -*- coding: utf-8 -*-

a = [[1, 0],[1, 2],[2, 9],[3, 0],[3, 8],[3, 1]]
res = {}
for i in a:
    if i[0] in res:
        res[i[0]] += i[1]
    else:
        res[i[0]] = i[1]

print res

输出:

{1: 2, 2: 9, 3: 9}

此输出采用字典格式。您可以根据需要将其转换为列表格式。

答案 1 :(得分:1)

这样的问题需要itertools.groupby。特别是groupby,将具有相同键的连续值分组,其中键可以由用户指定。然而,在这种情况下,密钥作为索引列表的特定元素是微不足道的,因此这应该是足以使用operator.itemgetter的理由。最后,您可以根据自己的品味和选择将其包装为功能(使用map / imap)或生成器表达式。

>>> from itertools import groupby, imap
>>> from operator import itemgetter
>>> lst=[[1, 0],[1, 2],[2, 9],[3, 0],[3, 8],[3, 1]]
>>> [[k, sum(imap(itemgetter(1), v))]
     for k, v in groupby(lst,key = itemgetter(0))]
[[1, 2], [2, 9], [3, 9]]

答案 2 :(得分:0)

这是m170897017技术的变体:

a = [[1, 0],[1, 2],[2, 9],[3, 0],[3, 8],[3, 1]]

result = {}
for day, val in a:
    if day not in result:
       result[day] = 0
    result[day] += val

print result

#Convert back into a list
print [list(t) for t in result.items()]

<强>输出

{1: 2, 2: 9, 3: 9}
[[1, 2], [2, 9], [3, 9]]

如果您使用的是Python 2.7或更高版本,则还可以使用Counter

另一种可能性是使用defaultdict,这是自Python 2.5以来一直可用的。

from collections import defaultdict

a = [[1, 0],[1, 2],[2, 9],[3, 0],[3, 8],[3, 1]]

result = defaultdict(int)
for day, val in a:
    result[day] += val

print [list(t) for t in result.items()]

<强>输出

[[1, 2], [2, 9], [3, 9]]

答案 3 :(得分:0)

您可以尝试使用defaultdict ...

from collections import defaultdict

dat = [[1, 0],[1, 2],[2, 9],[3, 0],[3, 8],[3, 1]]

d = defaultdict(int)
for k,v in dat: d[k] += v

答案 4 :(得分:0)

您可以使用collections.OrderedDict映射items列出:

l = [[1, 0],[1, 2],[2, 9],[3, 0],[3, 8],[3, 1]]

from collections import OrderedDict
d = OrderedDict()

for a, b in l:
    d.setdefault(a, 0)
    d[a] += b
print(map(list,d.iteritems()))

[[1, 2], [2, 9], [3, 9]]