Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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_List_Dictionary_Aggregate - Fatal编程技术网

Python 字典列表:按内部字典键分组聚合值

Python 字典列表:按内部字典键分组聚合值,python,list,dictionary,aggregate,Python,List,Dictionary,Aggregate,我有这个签名: def aggregate_by_player_id(input, playerid, fields): aggregate_by_player_id(input, 'player', ['stat1','stat3']) [{'player': '1', 'stat1': '3', 'stat2': '4', 'stat3': '5'}, {'player': '1', 'stat1': '1', 'stat2': '4', 'stat3': '1'}, {'player'

我有这个签名:

def aggregate_by_player_id(input, playerid, fields):
aggregate_by_player_id(input, 'player', ['stat1','stat3'])
[{'player': '1', 'stat1': '3', 'stat2': '4', 'stat3': '5'},
{'player': '1', 'stat1': '1', 'stat2': '4', 'stat3': '1'},
{'player': '2', 'stat1': '1', 'stat2': '2', 'stat3': '3'},
{'player': '2', 'stat1': '1', 'stat2': '2', 'stat3': '1'},
{'player': '3', 'stat1': '4', 'stat2': '1', 'stat3': '6'}]
nested_dic = {value_of_playerid1: {'playerid': value_of_playerid1, 'stat1': value_of_stat1, 'stat2': value_of_stat2}, 
              value_of_playerid2: {'playerid': value_of_playerid2, 'stat2': value_of_stat2, 'stat2': value_of_stat2}, 
              value_of_playerid3: {'playerid': value_of_playerid3, 'stat3': value_of_stat3, 'stat3': value_of_stat3}}
{'1': {'player': '1', 'stat1': 4, 'stat3': 6}, 
 '2': {'player': '2', 'stat1': 2, 'stat3': 4}, 
 '3': {'player': '3', 'stat1': 4, 'stat3': 6}} 
“字段”是指在“输入”中通过“playerID”对分组进行汇总的字段

我这样调用函数:

def aggregate_by_player_id(input, playerid, fields):
aggregate_by_player_id(input, 'player', ['stat1','stat3'])
[{'player': '1', 'stat1': '3', 'stat2': '4', 'stat3': '5'},
{'player': '1', 'stat1': '1', 'stat2': '4', 'stat3': '1'},
{'player': '2', 'stat1': '1', 'stat2': '2', 'stat3': '3'},
{'player': '2', 'stat1': '1', 'stat2': '2', 'stat3': '1'},
{'player': '3', 'stat1': '4', 'stat2': '1', 'stat3': '6'}]
nested_dic = {value_of_playerid1: {'playerid': value_of_playerid1, 'stat1': value_of_stat1, 'stat2': value_of_stat2}, 
              value_of_playerid2: {'playerid': value_of_playerid2, 'stat2': value_of_stat2, 'stat2': value_of_stat2}, 
              value_of_playerid3: {'playerid': value_of_playerid3, 'stat3': value_of_stat3, 'stat3': value_of_stat3}}
{'1': {'player': '1', 'stat1': 4, 'stat3': 6}, 
 '2': {'player': '2', 'stat1': 2, 'stat3': 4}, 
 '3': {'player': '3', 'stat1': 4, 'stat3': 6}} 
输入如下所示:

def aggregate_by_player_id(input, playerid, fields):
aggregate_by_player_id(input, 'player', ['stat1','stat3'])
[{'player': '1', 'stat1': '3', 'stat2': '4', 'stat3': '5'},
{'player': '1', 'stat1': '1', 'stat2': '4', 'stat3': '1'},
{'player': '2', 'stat1': '1', 'stat2': '2', 'stat3': '3'},
{'player': '2', 'stat1': '1', 'stat2': '2', 'stat3': '1'},
{'player': '3', 'stat1': '4', 'stat2': '1', 'stat3': '6'}]
nested_dic = {value_of_playerid1: {'playerid': value_of_playerid1, 'stat1': value_of_stat1, 'stat2': value_of_stat2}, 
              value_of_playerid2: {'playerid': value_of_playerid2, 'stat2': value_of_stat2, 'stat2': value_of_stat2}, 
              value_of_playerid3: {'playerid': value_of_playerid3, 'stat3': value_of_stat3, 'stat3': value_of_stat3}}
{'1': {'player': '1', 'stat1': 4, 'stat3': 6}, 
 '2': {'player': '2', 'stat1': 2, 'stat3': 4}, 
 '3': {'player': '3', 'stat1': 4, 'stat3': 6}} 
我的输出结构是:

def aggregate_by_player_id(input, playerid, fields):
aggregate_by_player_id(input, 'player', ['stat1','stat3'])
[{'player': '1', 'stat1': '3', 'stat2': '4', 'stat3': '5'},
{'player': '1', 'stat1': '1', 'stat2': '4', 'stat3': '1'},
{'player': '2', 'stat1': '1', 'stat2': '2', 'stat3': '3'},
{'player': '2', 'stat1': '1', 'stat2': '2', 'stat3': '1'},
{'player': '3', 'stat1': '4', 'stat2': '1', 'stat3': '6'}]
nested_dic = {value_of_playerid1: {'playerid': value_of_playerid1, 'stat1': value_of_stat1, 'stat2': value_of_stat2}, 
              value_of_playerid2: {'playerid': value_of_playerid2, 'stat2': value_of_stat2, 'stat2': value_of_stat2}, 
              value_of_playerid3: {'playerid': value_of_playerid3, 'stat3': value_of_stat3, 'stat3': value_of_stat3}}
{'1': {'player': '1', 'stat1': 4, 'stat3': 6}, 
 '2': {'player': '2', 'stat1': 2, 'stat3': 4}, 
 '3': {'player': '3', 'stat1': 4, 'stat3': 6}} 
因此输出应该如下所示:

def aggregate_by_player_id(input, playerid, fields):
aggregate_by_player_id(input, 'player', ['stat1','stat3'])
[{'player': '1', 'stat1': '3', 'stat2': '4', 'stat3': '5'},
{'player': '1', 'stat1': '1', 'stat2': '4', 'stat3': '1'},
{'player': '2', 'stat1': '1', 'stat2': '2', 'stat3': '3'},
{'player': '2', 'stat1': '1', 'stat2': '2', 'stat3': '1'},
{'player': '3', 'stat1': '4', 'stat2': '1', 'stat3': '6'}]
nested_dic = {value_of_playerid1: {'playerid': value_of_playerid1, 'stat1': value_of_stat1, 'stat2': value_of_stat2}, 
              value_of_playerid2: {'playerid': value_of_playerid2, 'stat2': value_of_stat2, 'stat2': value_of_stat2}, 
              value_of_playerid3: {'playerid': value_of_playerid3, 'stat3': value_of_stat3, 'stat3': value_of_stat3}}
{'1': {'player': '1', 'stat1': 4, 'stat3': 6}, 
 '2': {'player': '2', 'stat1': 2, 'stat3': 4}, 
 '3': {'player': '3', 'stat1': 4, 'stat3': 6}} 

在一个单一的理解中捕捉你想要的结果可能是可能的,但可能不是很可读。下面是一个简单的函数:

data = [
    {'player': '1', 'stat1': '3', 'stat2': '4', 'stat3': '5'},
    {'player': '1', 'stat1': '1', 'stat2': '4', 'stat3': '1'},
    {'player': '2', 'stat1': '1', 'stat2': '2', 'stat3': '3'},
    {'player': '2', 'stat1': '1', 'stat2': '2', 'stat3': '1'},
    {'player': '3', 'stat1': '4', 'stat2': '1', 'stat3': '6'}
]


def aggregate_dicts(ds, id_field, aggr_fields):
    result = {}
    for d in ds:
        identifier = d[id_field]
        if identifier not in result:
            result[identifier] = {f: 0 for f in aggr_fields}
        for f in aggr_fields:
            result[identifier][f] += int(d[f])
    return result


print(aggregate_dicts(data, 'player', ['stat1', 'stat3']))
结果:

{'1': {'stat1': 4, 'stat3': 6}, '2': {'stat1': 2, 'stat3': 4}, '3': {'stat1': 4, 'stat3': 6}}
如果要在dict内重复标识符,只需将此行添加到
If
块:

            result[identifier][id_field] = identifier

在一个单一的理解中捕捉你想要的结果可能是可能的,但可能不是很可读。下面是一个简单的函数:

data = [
    {'player': '1', 'stat1': '3', 'stat2': '4', 'stat3': '5'},
    {'player': '1', 'stat1': '1', 'stat2': '4', 'stat3': '1'},
    {'player': '2', 'stat1': '1', 'stat2': '2', 'stat3': '3'},
    {'player': '2', 'stat1': '1', 'stat2': '2', 'stat3': '1'},
    {'player': '3', 'stat1': '4', 'stat2': '1', 'stat3': '6'}
]


def aggregate_dicts(ds, id_field, aggr_fields):
    result = {}
    for d in ds:
        identifier = d[id_field]
        if identifier not in result:
            result[identifier] = {f: 0 for f in aggr_fields}
        for f in aggr_fields:
            result[identifier][f] += int(d[f])
    return result


print(aggregate_dicts(data, 'player', ['stat1', 'stat3']))
结果:

{'1': {'stat1': 4, 'stat3': 6}, '2': {'stat1': 2, 'stat3': 4}, '3': {'stat1': 4, 'stat3': 6}}
如果要在dict内重复标识符,只需将此行添加到
If
块:

            result[identifier][id_field] = identifier
我们可以使用它对
playerid
进行分组,然后对字段中的值求和

from itertools import groupby
from operator import itemgetter

def aggregate_by_player_id(input_, playerid, fields):
    player = itemgetter(playerid)
    output = {}

    for k, v in groupby(input_, key=player):
        data = list(v)
        stats = {playerid: k}

        for field in fields:
            stats[field] = sum(int(d.get(field, 0)) for d in data)
        output[k] = stats
    return output

data.sort(key=player) # data must be pre-sorted on grouping key
results = aggregate_by_player_id(data, 'player', ['stat1', 'stat3'])

{'1': {'player': '1', 'stat1': 4, 'stat3': 6},
 '2': {'player': '2', 'stat1': 2, 'stat3': 4},
 '3': {'player': '3', 'stat1': 4, 'stat3': 6}}
我们可以使用它对
playerid
进行分组,然后对字段中的值求和

from itertools import groupby
from operator import itemgetter

def aggregate_by_player_id(input_, playerid, fields):
    player = itemgetter(playerid)
    output = {}

    for k, v in groupby(input_, key=player):
        data = list(v)
        stats = {playerid: k}

        for field in fields:
            stats[field] = sum(int(d.get(field, 0)) for d in data)
        output[k] = stats
    return output

data.sort(key=player) # data must be pre-sorted on grouping key
results = aggregate_by_player_id(data, 'player', ['stat1', 'stat3'])

{'1': {'player': '1', 'stat1': 4, 'stat3': 6},
 '2': {'player': '2', 'stat1': 2, 'stat3': 4},
 '3': {'player': '3', 'stat1': 4, 'stat3': 6}}

看起来您正在查找字典属性(
'stat1','stat3'
)的总和,以查找与其他属性(
'player'
)的值匹配的所有条目?你有没有看过字典里的理解法,自己也试过什么。我试图对每个玩家ID总结('stat1','stat3')。我试了很多圈。最后我总结了所有的球员,或者只重新定义了最后一个…如果你有熊猫,这其实很简单。我不知道熊猫,但我可以学习。。。我是python的初学者,但我会尽我最大的努力。我不建议仅仅为了一个特定的任务而打开一个全新的库。它用于数据重塑、转换和聚合,因此您可能希望在将来记住它的存在。看起来您正在寻找字典属性(
'stat1','stat3'
)的总和,用于所有与其他属性值匹配的条目(
'player'
)?你有没有看过字典里的理解法,自己也试过什么。我试图对每个玩家ID总结('stat1','stat3')。我试了很多圈。最后我总结了所有的球员,或者只重新定义了最后一个…如果你有熊猫,这其实很简单。我不知道熊猫,但我可以学习。。。我是python的初学者,但我会尽我最大的努力。我不建议仅仅为了一个特定的任务而打开一个全新的库。它用于数据重塑、转换和聚合,因此您可能希望在将来记住它的存在。