[英]How to subdivide a nested list (used as a matrix) into lists based on the string in the 0th column
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
我需要能夠對物種的每個量的計算值求和
我看到的唯一方法是將列表細分為每個物種的列表。 我怎樣才能做到這一點? 完成后,我可以獲取列總計。
您可以使用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
第一列中命名的物種映射到為該物種計算的總和。
您可以使用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
必須按照要分組的列進行排序。 k
和g
代表“鍵”和“組”。 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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.