Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何根据第0列中的字符串将嵌套列表(用作矩阵)细分为列表_Python_Loops_Nested_Split - Fatal编程技术网

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

Python 如何根据第0列中的字符串将嵌套列表(用作矩阵)细分为列表,python,loops,nested,split,Python,Loops,Nested,Split,这是来自样本站点的数据。每一行都是一个观察。观察的数量、涉及的物种数量以及每个物种的数量各不相同,即每个物种可能有几个个体。(我使用了物种_1等作为一个物种的字母数字代码的替代物-涉及数百个物种,每个站点只有少数物种-我希望能够直接输入代码)。观察到的行数可能约为20-30行,物种数可能为4-8行 我需要能够对每个物种的计算值求和 我看到的唯一方法是将列表细分为每个物种的列表。我该怎么做?一旦我这样做了,我可以采取列总数 您可以使用defaultdict通过键对行进行“分组”: trees=[

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

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


我看到的唯一方法是将列表细分为每个物种的列表。我该怎么做?一旦我这样做了,我可以采取列总数

您可以使用
defaultdict
通过键对行进行“分组”:

trees=[
['species_1', observednumber_1, calculatedvalue, calculatedvalue],
['species_2', observednumber_2, calculatedvalue, calculatedvalue],
['species_1', observednumber_3, calculatedvalue, calculatedvalue],
[etc.]
]
现在,
grouped
是一个以第一列为键的字典,值是所有行的列表,它们都具有相同的第一列

您可以就地进行求和:

from collections import defaultdict

grouped = defaultdict(list)

for row in trees:
    grouped[row[0]].append(row)
其中,
行[1]*行[2]
可以是任何表达式。现在
grouped
将第一列中命名的物种映射到为该物种计算的总和。

您可以使用

结果:

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)

谢谢,这对一个专栏有效。很抱歉,我的问题无意中模棱两可-我需要第[2]列和第[3]列的总和(在我的示例中)。我输入了虚拟数据并指定了[2],如果我指定了[3],结果也是正确的。但是如果我在print语句中通过{重复sum(..)}来输入这两个,那么第二个结果是0。这是因为
g
是一个生成器,正如我在“Notes:”下所述。您可以将生成器的结果存储在类似列表的数据结构中,然后在该列表而不是生成器上进行计算。如果需要我插入如何执行上述操作的示例,请告诉我。很好,但这使我摆脱了for语句中的key=op.itemgetter(0)之一。您可以在前一行中进行排序。代码示例简洁;不一定是编写代码的理想方式:-)
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
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)