簡體   English   中英

如何基於第0列中的字符串將嵌套列表(用作矩陣)細分為列表

[英]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 必須按照要分組的列進行排序。
  • 變量kg代表“鍵”和“組”。
  • 請注意, 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM