簡體   English   中英

當某些鍵重復時如何將字典列表轉換為字典

[英]how to convert list of dict to dict when some keys repeated

我有字典列表,類似於:

results=[{'year':2020,'id':'321abc','color':'blue'},
{'year':2020,'id':'412nbg','color':'brown'},
{'year':2021,'id':'klp54','color':'yellow'}...]

我想組織它,成為一個字典而不是帶字典的列表,並且組織它,所以我將年份作為鍵,然后將所有 id 和 colors 作為值。 看到這篇文章也有類似的問題,但是,它們的鍵是唯一的(參考帖子中的名稱),而我卻重復了(在我的例子中是幾年)。

所以最后也許它會是嵌套字典,像這樣:

results={ 2020:{id{},color{}},2020:{id{},color{},2022:{id:{},color:{}}

(當我每年有很多 id 和 colors 時)我該怎么做?

使用itertools.groupby和一些列表和字典理解,這是微不足道的。 請記住,您需要先排序,否則groupby將無法按您想要的方式工作。 你會得到重復的組。

results = [{'year': 2020, 'id': '321abc', 'color': 'blue'},
           {'year': 2020, 'id': '412nbg', 'color': 'brown'},
           {'year': 2021, 'id': 'klp54', 'color': 'yellow'}]

from itertools import groupby
from operator import itemgetter

year = itemgetter('year')

r = sorted(results, key=year)
# [{'year': 2020, 'id': '321abc', 'color': 'blue'}, 
#  {'year': 2020, 'id': '412nbg', 'color': 'brown'}, 
#  {'year': 2021, 'id': 'klp54', 'color': 'yellow'}]

g = groupby(r, key=year)
# <itertools.groupby object at 0x7f9f2a232138>

{k: [{'id': x['id'], 'color': x['color']} for x in v] 
     for k, v in g}
# {2020: [{'id': '321abc', 'color': 'blue'}, 
#         {'id': '412nbg', 'color': 'brown'}], 
#  2021: [{'id': 'klp54', 'color': 'yellow'}]}

您可以使用dict.setdefaultcollections.defaultdict

from collections import defaultdict

results = [{'year': 2020, 'id': '321abc', 'color': 'blue'},
           {'year': 2020, 'id': '412nbg', 'color': 'brown'},
           {'year': 2021, 'id': 'klp54', 'color': 'yellow'}]
res = {}
res_2 = defaultdict(list)
for dct in results:
    res.setdefault(dct['year'], []).append({
        'id' : dct['id'], 
        'color':dct['color']
    })

    # Or
    res_2[dct['year']].append({'id' : dct['id'], 'color':dct['color']})

    
print(res)
print(res_2)

Output:

# res =>
{
    2020: [{'id': '321abc', 'color': 'blue'}, 
           {'id': '412nbg', 'color': 'brown'}], 
    2021: [{'id': 'klp54', 'color': 'yellow'}]
}


# res_2 =>
defaultdict(<class 'list'>, 
            {2020: [{'id': '321abc', 'color': 'blue'}, 
                    {'id': '412nbg', 'color': 'brown'}], 
             2021: [{'id': 'klp54', 'color': 'yellow'}]}
           )

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM