Python 为字典列表中的两个键创建唯一的字典

Python 为字典列表中的两个键创建唯一的字典,python,dictionary,unique,Python,Dictionary,Unique,我从API中获得以下格式的词典列表: 例如 因此,为了将查询存储/优化到数据库中,我必须将它们转换为这种格式 生成以下结构的有效方法或其他方法是什么 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]

我从API中获得以下格式的词典列表:

例如

因此,为了将查询存储/优化到数据库中,我必须将它们转换为这种格式

  • 生成以下结构的有效方法或其他方法是什么

    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个循环只是为了找到唯一的dict。

只需使用使项目唯一的值作为字典的键:

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']]
如有必要,您可以在以后再次列出此列表。

您可以使用:


你只需要收集不同的
name
s?@Jasper-是的,但是也可以有多个键,比如name,假设是email。谢谢!理解我(python新手)有点棘手。请您解释一下,我如何将此代码用于其他不同的钥匙。假设
name
email
。您想用这些其他键做什么?它的作用是按
id
day
对项目进行分组,并将
名称
转换为一个列表,以附加更多的名称第一次遇到唯一值(之前未遇到的id+天)
grouped[key]
将抛出一个
KeyError
,并执行该部分代码。下次遇到相同的id+day组合时,名称将简单地添加到
name
列表中。首先,尝试理解代码并尝试自己解决修改后的问题,这是掌握python
dict
s@deceze-谢谢,我明白了。我现在可以修改代码了。我只需要将它们保存到DB中。功能性回答不错+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']]
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]})