2011-02-06 76 views
1

我不是一个普通的Python程序员,所以请和我一起裸照。如何总结类似组的数字?

我有两个问题。我试图写一个脚本这需要命令行参数,我看我可以启动脚本中使用:

#!/bin/env python 

exec python -x "$0" "[email protected]" 

什么是这两个之间的区别?

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

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 

预先感谢您的时间。我非常感谢你的帮助。干杯!!

+1

欢迎来到stackoverflow!请提出两个问题......两个问题。这样,写入/评分答案和读取整个文件都变得更加容易。 – phihag 2011-02-06 11:22:15

+1

@phiha,对不起。我会记住将来。干杯!! – MacUsers 2011-02-06 14:22:33

回答

1

此代码小片段让你总结你的群体,因为他们是从标准输入读取:

import sys 

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

print groups 
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是一种数据结构,看起来像一本字典,但如果你看看一个值,它不包含它的默认值会自动创建它。所以这是一个简洁明了的生成组词典的方式:实时价值。

+0

我输入集合时出错 - 有什么想法吗? – MacUsers 2011-02-06 14:21:22

+0

@MacUsers:或者您使用的是Python 2.3或更早的版本(在这种情况下,您应该升级;从那时起Python已经有了很多改进),或者您在`collections`中有一个错字。 (或者有些奇怪的事情正在发生:如果这两个都不是问题,你可以发布完整的错误吗?) – katrielalex 2011-02-06 18:21:50

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 

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