2011-02-06 95 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 

關於你的第一個問題......兩種方法是等價的。