合并重复列表的字典项目值

2024-03-28 14:57:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个重复值(coach)的字典列表。你知道吗

d = [
    {"players": [{"id": 179, "name": "Santosh"}], "coach": "Xavi Alonso"}, 
    {"players": [{"id": 180, "name": "Hari"}], "coach": "Xavi Alonso"}, 
    {"players": [{"id": 175, "name": "Hitman"}], "coach": "Anna Puyol"}
]

我想根据coach名称合并重复项。我怎样才能做到这一点?你知道吗

def exportplayers(request):
    d = [
        {"players": [{"id": 179, "name": "Santosh"}, {"id": 180, "name": "Hari"}], "coach": "Xavi Alonso"}, 
        {"players": [{"id": 175, "name": "Hitman"}], "coach": "Anna Puyol"}
    ]


    return HttpResponse(json.dumps(d))

Tags: name名称id列表字典defplayersanna
3条回答

您可以使用itertools模块中的^{}operator模块中的^{}来实现这一点。可以将grouby操作看作是从记录中返回连续键和组的一种方法。为了让它工作,您需要按照sorted函数在这里所做的“coach”值对列表中的“items”进行排序。当然,为了自定义排序顺序,您需要提供一个键函数,其中一种方法是使用类似于sorted(d, key=lambda _: _["coach"])的lambda表达式,但我更喜欢使用sorted(d, key=itemgetter('coach'))的另一种方法,也就是说,您还需要向groupby提供键参数,这是一个计算每个元素的键值的函数在documentation中提到,同样可以使用key=itemgetter("coach")。你知道吗

from itertools import groupby
from operator import itemgetter



def exportplayers(request):
    d = [
        {"players": [{"id": 179, "name": "Santosh"}, {"id": 180, "name": "Hari"}], "coach": "Xavi Alonso"}, 
        {"players": [{"id": 175, "name": "Hitman"}], "coach": "Anna Puyol"}
    ]
    my_list = []
    for g, data in groupby(sorted(d, key=itemgetter('coach')),  key=itemgetter('coach')):
        my_list.append({"coach": g, "players": [player for item in data for player in item["players"]]})
    return HttpResponse(json.dumps(my_list))

使用lambda表达式作为键函数的演示:

>>> from itertools import groupby
>>> d = [
...     {"players": [{"id": 179, "name": "Santosh"}], "coach": "Xavi Alonso"}, 
...     {"players": [{"id": 180, "name": "Hari"}], "coach": "Xavi Alonso"}, 
...     {"players": [{"id": 175, "name": "Hitman"}], "coach": "Anna Puyol"}
... ]
>>> sorted_d = sorted(d, key=lambda _: _['coach'])
>>> for g, data in groupby(sorted_d, key=lambda _: _['coach']):
...     print({"coach": g, "players": [player for item in data for player in item["players"]]})
... 
{'coach': 'Anna Puyol', 'players': [{'id': 175, 'name': 'Hitman'}]}
{'coach': 'Xavi Alonso', 'players': [{'id': 179, 'name': 'Santosh'}, {'id': 180, 'name': 'Hari'}]}

一种可能的解决方案是构建一个辅助字典,以coach作为键,以players列表作为值

d = [
    {"players": [{"id": 179, "name": "Santosh"}], "coach": "Xavi Alonso"},
    {"players": [{"id": 180, "name": "Hari"}], "coach": "Xavi Alonso"},
    {"players": [{"id": 175, "name": "Hitman"}], "coach": "Anna Puyol"}
]
aux = collections.defaultdict(list)
for e in d:
    aux[e['coach']].append(e['players'][0])

aux现在是:

>>> aux
defaultdict(<type 'list'>, {'Xavi Alonso': [[{'id': 179, 'name': 'Santosh'}], [{'id': 180, 'name': 'Hari'}]], 'Anna Puyol': [[{'id': 175, 'name': 'Hitman'}]]})

然后你可以用一个列表来建立你的返回值

[{'players':v, 'coach':k} for k,v in aux.items()]

哪个是

[{'players': [{'id': 179, 'name': 'Santosh'}, {'id': 180, 'name': 'Hari'}], 'coach': 'Xavi Alonso'}, {'players': [{'id': 175, 'name': 'Hitman'}], 'coach': 'Anna Puyol'}]

像这样:

coaches = []
new_d = []

for dic in d:
    if dic["coach"] in coaches:
        ind = coaches.index(dic["coach"])
        new_d[ind]["players"].append(dic["players"])
    else:
        coaches.append(dic["coach"])        
        new_d.append(dic)

print new_d

但在这里用词变得很奇怪。。。上课怎么样?你知道吗

相关问题 更多 >