在去除重复的同时重新排列词典列表的最常用方法



我有一个字典列表,每个字典都包含两个可能值不同的相同键:

list_of_dicts = [
{'a': '1', 'b': '1'},
{'a': '4', 'b': '4'},
{'a': '1', 'b': '1'},
{'a': '3', 'b': '0'},
{'a': '1', 'b': '2'},
{'a': '4', 'b': '99'}
]

我想重新排列这个结构,使其中一个键的值是一个键,该值是其他值的字典(稍后将向这些字典添加更多的键(。

我还想保留这些键的不同值(不重复(。所以结果应该是:

{'1': {'b': {'1', '2'}}, '4': {'b': {'4', '99'}}, '3': {'b': {'0'}}}

这样做的目的是为了

  • 删除"a"的重复值
  • 能够在本例中基于键1,4,3调用dict
  • 保留保存在另一个键值中的信息

这是我为此编写的代码:

newdict = 
{d['a']: { #for each unique a value, build a dict with key b containing a set of all b values
'b':{d['b']} | {another_d['b'] for another_d in list_of_dicts if another_d['a'] == d['a']}
} 
for d in list_of_dicts}

但我想知道是否有更地道或更干净的方式来写这篇文章?我试过使用d.get((,但我认为它不能用。

尝试:

list_of_dicts = [
{"a": "1", "b": "1"},
{"a": "4", "b": "4"},
{"a": "1", "b": "1"},
{"a": "3", "b": "0"},
{"a": "1", "b": "2"},
{"a": "4", "b": "99"},
]
out = {}
for d in list_of_dicts:
for k in d.keys() ^ "a":
out.setdefault(d["a"], {}).setdefault(k, set()).add(d[k])
print(out)

打印:

{'1': {'b': {'1', '2'}}, '4': {'b': {'99', '4'}}, '3': {'b': {'0'}}}

最新更新