Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.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中的分组_Python - Fatal编程技术网

Python中的分组

Python中的分组,python,Python,我有一个字典列表(我使用CSV上传),我想基于其中一个“列”运行一个“groupby”。我试图根据teamID分组,并根据这些分组对“R”列求和 我正在尝试以下代码: import itertools for key, group in itertools.groupby(batting, lambda item: item["teamID"]): print key, sum([item["R"] for item in group]) 但是,我没有看到它们正确分组。将有多个相同团

我有一个字典列表(我使用CSV上传),我想基于其中一个“列”运行一个“groupby”。我试图根据teamID分组,并根据这些分组对“R”列求和

我正在尝试以下代码:

import itertools

for key, group in itertools.groupby(batting, lambda item: item["teamID"]):
    print key, sum([item["R"] for item in group])
但是,我没有看到它们正确分组。将有多个相同团队ID的实例

例如:

RC1 30
CL1 28
WS3 28
RC1 29
FW1 9
RC1 0
BS1 66
FW1 1
BS1 13
CL1 18

正如帕德里克在评论中所说,
itertools.groupby()
需要有序的数据来完成您想要的任务。最简单的解决方案(如最少的代码编辑)是:

import itertools

key_func = lambda item: item["teamID"]

for key, group in itertools.groupby(sorted(batting, key=key_func), key_func):
    print key, sum([item["R"] for item in group])

如果你的数据比较大,你可能想考虑一些更有效的东西,而不需要在内存中重复复制的副本。注释中提到的code>defaultdict可能是一个不错的选择

from collections import defaultdict

d = defaultdict(int)

for item in batting:
  d[item['teamID']] += item.get('R', 0) or 0

for team, r_sum in sorted(d.items(), key=lambda x: x[0]):
  print team, r_sum

Python 3的代码可能需要稍作调整。

groupby需要有序数据,请使用defaultdict。您可以按团队id对数据进行排序,但为什么要添加n log n复杂性?当您可以轻松获得线性解决方案时,我添加了一个示例。这里的问题是“团队id”是一个字符串。当我运行这个命令时,我得到了一个错误:不支持+=:“int”和“NoneType”的操作数类型听起来好像有些行没有R。我已经更新了代码以支持它。我更新了它以按团队排序。如果要按数字排序,请将0更改为1。