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