如何根据第0列中的字符串将嵌套列表(用作矩阵)细分为列表

时间:2013-05-01 15:20:30

标签: python loops nested split

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

这是来自示例网站的数据。每行都是观察。观察的数量,涉及的物种数量和每个物种的数量各不相同 - 即每个物种可能有几个个体。 (我使用了物种_1等作为物种的alphameric代码的代表 - 涉及数百种物种,每个地点只有少数物种 - 我希望能够直接输入代码)。 (观察)行的数量可以是约20-30和物种数量4-8

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

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

2 个答案:

答案 0 :(得分: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将第一列中命名的物种映射到为该物种计算的总和。

答案 1 :(得分: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)