2016-01-07 4 views
2

Я получаю список словарей в формате из API,:Создание уникальных словарей для двух ключей в списке словарей

например.

xlist =[ 
    { "id":1, "day":2, name:"abc", ... }, 
    { "id":1, "day":3, name:"abc", ... }, 
    { "id":1, "day":2, name:"xyz", ... }, 
    { "id":1, "day":3, name:"xyz", ... },... 
    ] 

Итак, чтобы хранить/оптимизировать запросы в БД, я должен их преобразовать в этом формате.

  • Что является эффективным или другим способом создания следующей структуры?

    unique_xlist =[ 
        { "id":1, "day":2, name:["abc", "xyz"], ... }, 
        { "id":1, "day":3, name:["abc", "xyz"], ... }, 
    ] 
    

Что я делаю:

names = list(set([ v['name'] for v in xlist])) #-- GET UNIQUE NAMES 
templist = [{k:(names if k == 'name' else v) \ 
      for k, v in obj.items()} for obj in xlist] #-- Append Unique names 
unique_xlist= {v['day']:v for v in templist}.values() #- find unique dicts 

Я не думаю, что это очень эффективно, я с помощью 3 петли просто найти уникальную dicts от дня.

+0

Вы вы только должны собрать разные 'имени была? – Jasper

+0

@ Jasper - Да, также, но может быть несколько ключей, таких как имя, предположим, электронная почта. – trex

ответ

4

Вы можете использовать itertools.groupby:

from itertools import groupby 

xlist.sort(key=lambda x: (x["id"], x["day"], x["name"])) # or use sorted() 
unique_xlist = [] 

for k, g in groupby(xlist, lambda x: (x["id"], x["day"])): 
    unique_xlist.append({"id": k[0], "day": k[1], "name": [i["name"] for i in g]}) 
+2

хороший функциональный ответ +1. не уверен, что вы хотите дать это новичкам. – Alex

1

Просто используйте значение, что делает предмет уникальным в качестве ключа к словарю:

grouped = {} 
for x in xlist: 
    key = (x['id'], x['day']) 
    try: 
     grouped[key]['name'].append(x['name']) 
    except KeyError: 
     grouped[key] = x 
     grouped[key]['name'] = [x['name']] 

Вы можете listify это снова после этого в случае необходимости.

+0

Спасибо! Это немного сложно понять (новичок на python). Не могли бы вы объяснить, как я могу использовать этот код для других других клавиш. предположим «имя» и «письмо». – trex

+1

Что вы хотите делать с этими другими ключами? То, что это делает, - это элементы группы с помощью 'id' и' day', и оно преобразует 'name' в список, чтобы добавить дальнейшие имена. - В первый раз, когда вы сталкиваетесь с уникальным значением (id + день, который не встречался раньше) 'grouped [key]' будет вызывать 'KeyError', и эта часть кода будет выполнена. В следующий раз, когда вы столкнетесь с одной и той же комбинацией id + day, имя просто добавляется в список «name». – deceze

+1

Сначала попробуйте разобраться в коде и попытаться решить измененную проблему самостоятельно, это очень приятное упражнение для освоения python 'dict's – rocksportrocker