Skip to main content
 首页 » 编程设计

python之从 dict 创建字典列表的更多 pythonic 方法,其中列表元素是 `{v:[k1, k2, k3]}` 形式的字典

2025年05月04日11webabcd

我需要从字典创建一个字典列表。原始字典必须有键不重复但值可以。例如:

{ 'b': 68, 'c': 68, 'x': 68, 'z': 401, 'aa':401, 'a': 2} 

我需要从上面创建一个字典列表,如下所示:

[{68: ['b', 'c', 'x']}, {401: ['z', 'aa']}, {2: ['a']}] 

我尝试了什么?我已经尝试过这个并且它有效,但我确信可能有更好的方法来实现相同的结果。

lofd=[] 
origdict = { 'b': 68, 'c': 68, 'x': 68, 'z': 401, 'aa':401, 'a': 2} 
for i in origdict.items(): 
    k = i[0] 
    v = i[1] 
    try: 
        d[v].append(k) 
    except: 
        d = {v:[]} 
        d[v].append(k) 
    if d not in lofd: 
        lofd.append(d) 
 
lofd 
[{68: ['b', 'c', 'x']}, {401: ['z', 'aa']}, {2: ['a']}] 

我看过其他问题,人们可能认为这些问题与此问题重复,但这些问题的答案并未涵盖如何将字典转换为字典列表。有很多答案应该如何反转字典,这有点像我正在尝试做的,但我没有反转字典。有答案显示从字典创建一个元组的元组,但我确实需要一个字典列表,而不是不可变的元组。

请您参考如下方法:

您也可以使用列表理解来做到这一点:

[dict((_, )) for _ in {v: [_k for _k, _v in d.items() if _v ==  v] for v in d.values()}.items()] 

为了证明它有效

>>> d = { 'b': 68, 'c': 68, 'x': 68, 'z': 401, 'aa':401, 'a': 2} 
>>> [dict((_, )) for _ in {v: [_k for _k, _v in d.items() if _v ==  v] for v in d.values()}.items()] 
[{68: ['b', 'c', 'x']}, {401: ['z', 'aa']}, {2: ['a']}] 

注意 我不太清楚这是什么用途,但如果可以的话,我建议您使用字典而不是字典列表,因为这种理解比单独的字典理解要慢.如果可能的话,我建议只使用 dict 理解,这在我看来会好得多,尽管返回一个 dict 而不是一个 more pythonic 的列表,或者至少更有意义,特别是因为你可以使用 dict.items() 对其进行相同的迭代。

{v: [_k for _k, _v in d.items() if _v ==  v] for v in d.values()} 

这会返回一个字典,如下所示:

{68: ['b', 'c', 'x'], 401: ['z', 'aa'], 2: ['a']}