如何总结类似群体的数字?

时间:2011-02-06 11:17:16

标签: python

我有两个问题。我正在尝试编写一个带有命令行参数的脚本,我看到我可以使用:

启动脚本
#!/bin/env python

exec python -x "$0" "$@"

这两者之间有什么区别?

第二个问题是脚本编写。我有一个像这样的输入数据集:

group_a 5
group_a 7
group_c 6
group_a 8
group_b 8
group_b 4
group_c 7
group_a 8
....
....

如何将所有相似项目组合在一起并总结如下数字:

group_a 28
group_b 12
group_c 13

3 个答案:

答案 0 :(得分:5)

这应该是两个单独的问题。

1)这两种方式是等价的。 shebang只是将程序标记为由Python执行,因此您在运行它时不必指定它。

2)

import collections
groups = collections.defaultdict(int)

for line in data_set:
    group, value = line.split()
    groups[group] += int(value)

collections.defaultdict是一个看起来像字典的数据结构,但是如果你查找一个不包含它的值,它会自动使用默认值创建它。因此,这是生成组字典的简洁方式:即时值。

答案 1 :(得分:1)

这段代码片段允许您在从stdin中读取组时对它们进行汇总:

import sys

groups = {}
for l in sys.stdin:
    group, value = l.split()
    s = groups.get(group, 0)
    groups[group] = s + int(value)

print groups

答案 2 :(得分:0)

关于第二个问题......

这是使用groupbyitertools yield的完美案例。这是我的解决方案:

from itertools import groupby
input = [("group_a",5),("group_a",7),("group_c", 6),
("group_a", 8),("group_b", 8),("group_b", 4),("group_c", 7),
("group_a", 8)]

def group(l):
    grouped = groupby(sorted(l), lambda x: x[0])
    for k,n in grouped:
        s = sum(val for name,val in n)
        yield (k,s)

if __name__ == "__main__":
    for (g,s) in group(input):
        print g,s

关于你的第一个问题......两种方式都是等价的。