2013-05-01 20 views
1
trees=[ 
['species_1', observednumber_1, calculatedvalue, calculatedvalue], 
['species_2', observednumber_2, calculatedvalue, calculatedvalue], 
['species_1', observednumber_3, calculatedvalue, calculatedvalue], 
[etc.] 
] 

這是來自示例站點的數據。每一行都是一個觀察。觀察次數,涉及的物種數量和每個物種的數量都不相同 - 即每個物種可能有幾個個體。 (我已使用species_1等作爲一個物種的字母數字代碼的替代品 - 有數百種物種參與,每個網站只有幾個 - 我希望能夠直接輸入代碼)。的(意見)的行數可能是20-30和物種4-8如何根據第0列中的字符串將嵌套列表(用作矩陣)細分爲列表

我需要能夠總結的計算值對於每個物種

的我看到的唯一方法的數量這樣做是否將列表細分爲每個物種的列表。我怎樣才能做到這一點?一旦我完成了,我可以列總計。

回答

0

您可以使用http://docs.python.org/2/library/itertools.html#itertools.groupby

import itertools as it, operator as op 

# some dummy data so the example runs 
observednumber_1 = 1 
observednumber_2 = 2 
observednumber_3 = 3 
calculatedvalue = None 

trees=[ 
    ['species_1', observednumber_1, calculatedvalue, calculatedvalue], 
    ['species_2', observednumber_2, calculatedvalue, calculatedvalue], 
    ['species_1', observednumber_3, calculatedvalue, calculatedvalue], ] 

for k,g in it.groupby(sorted(trees,key=op.itemgetter(0)),key=op.itemgetter(0)): 
    print k,sum(i[1] for i in g) 

結果:

 
species_1 4 
species_2 2 

注:

  • 輸入到itertools.groupby必須由列(或多個)進行排序時,您會分組。
  • 變量kg分別代表「key」和「group」。
  • 請注意,g是一個生成器,如果您想重新使用它,您可能需要將其暫時存儲在列表或其他數據結構中。

編輯:我已經添加了如何使用另一種數據結構來存儲產生器,用於進一步的計算結果的例子。

for k,g in it.groupby(sorted(trees,key=op.itemgetter(0)),key=op.itemgetter(0)): 
    tempg = list(g) 
    print k, sum(i[1] for i in tempg), sum(i[2] for i in tempg) 
+0

謝謝,這適用於一列。我道歉,但我的問題是無意中模棱兩可的 - 我需要列[2]和列[3]的總和(在我的例子中)。我輸入了虛擬數據並指定了[2],如果我指定[3],它也是正確的。但是如果我在print語句中重複了{sum(....)},第二個出現爲0。 – user2339719 2013-05-02 17:22:48

+0

這是因爲'g'是一個生成器,正如我在「註釋」中所述的那樣。您可以將生成器的結果存儲在列表等數據結構中,然後在該列表上進行計算,而不是在生成器上進行計算。 – bernie 2013-05-02 17:31:15

+0

如果您需要我插入如何執行上述操作的示例,請告訴我。 – bernie 2013-05-02 17:31:41

2

您可以通過一鍵使用defaultdict爲「組」行:

from collections import defaultdict 

grouped = defaultdict(list) 

for row in trees: 
    grouped[row[0]].append(row) 

現在grouped是第一列的關鍵一本字典,和值是行列出了所有必須先同柱。

你可以做就地求和:

from collections import defaultdict 

grouped = defaultdict(int) 

for row in trees: 
    grouped[row[0]] += row[1] * row[2] 

其中row[1] * row[2]可以是任意表達式。現在grouped將第一列中命名的物種映射到爲該物種計算的總和。

+0

+1有趣的方法 – bernie 2013-05-01 15:27:35

相關問題