2016-04-21 72 views
2

我有以下的字典值(教练)重复的列表。合并重复的字典项目值列表

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"} 
] 

我想根据教练名称合并重复项目。我怎样才能做到这一点?

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)) 

回答

1

您可以使用itertools模块中的groupbyoperator模块中的itemgetter来完成此操作。将grouby作为从记录中返回连续密钥和组的方式。为了使它起作用,您需要将列表中的“项目”按照“coach”值进行排序,这是sorted函数在此处执行的操作。当然,你需要提供一个关键函数来定制你的排序顺序,一种方法是使用这样的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'}]} 
2

一个可能的解决方案是建立一个能与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'}] 
+0

这是完美@Francesco – MysticCodes

1

像这样:

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 

但这里使用dictionnary变得陌生......什么课?

+0

完美!谢谢文斯 – MysticCodes