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

我需要能够对每个物种的计算值求和

我认为这样做的唯一方法是将列表细分为每个物种的列表。我怎样才能做到这一点?完成后,我可以获取列总计。

4

2 回答 2

2

您可以使用一个defaultdict键来“分组”行:

from collections import defaultdict

grouped = defaultdict(list)

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

Nowgrouped是一个以第一列为键的字典,值是所有具有相同第一列的行的列表。

您可以就地求和:

from collections import defaultdict

grouped = defaultdict(int)

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

whererow[1] * row[2]可以是任何表达式。现在grouped将第一列中命名的物种映射到为该物种计算的总和。

于 2013-05-01T15:24:07.887 回答
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)

结果:

物种_1 4
物种_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)
于 2013-05-01T15:27:26.000 回答