使用字典理解将列表转换为具有重复键的字典

Arc*_*hie 2 python python-2.7

大家好,

我正在尝试使用以下内容将长度为 2 的项目列表转换为字典:

my_list = ["b4", "c3", "c5"]
my_dict = {key: value for (key, value) in my_list}
Run Code Online (Sandbox Code Playgroud)

问题是当列表中出现多个键时,只保留最后一个键及其值。

所以在这种情况下,而不是

my_dict = {'c': '3', 'c': '5', 'b': '4'}
Run Code Online (Sandbox Code Playgroud)

我得到

my_dict = {'c': '5', 'b': '4'}
Run Code Online (Sandbox Code Playgroud)

即使有重复的键,我如何保留所有键:值对。谢谢

Vik*_*ngh 6

对于字典中的一个键,您只能存储一个值。

您可以选择将该值作为列表。

{'b': ['4'], 'c': ['3', '5']}
Run Code Online (Sandbox Code Playgroud)

以下代码将为您做到这一点:

new_dict = {}
for (key, value) in my_list:
    if key in new_dict:
        new_dict[key].append(value)
    else:
        new_dict[key] = [value]
print(new_dict)
# output: {'b': ['4'], 'c': ['3', '5']}
Run Code Online (Sandbox Code Playgroud)

可以做同样的事情setdefault。感谢@Aadit M Shah 指出

new_dict = {}
for (key, value) in my_list:
    new_dict.setdefault(key, []).append(value)
print(new_dict)
# output: {'b': ['4'], 'c': ['3', '5']}
Run Code Online (Sandbox Code Playgroud)

可以做同样的事情defaultdict。感谢@MMF 指出。

from collections import defaultdict
new_dict = defaultdict(list)
for (key, value) in my_list:
    new_dict[key].append(value)
print(new_dict)
# output: defaultdict(<class 'list'>, {'b': ['4'], 'c': ['3', '5']})
Run Code Online (Sandbox Code Playgroud)

您还可以选择将值存储为字典列表:

[{'b': '4'}, {'c': '3'}, {'c': '5'}]
Run Code Online (Sandbox Code Playgroud)

以下代码将为您做到这一点

new_list = [{key: value} for (key, value) in my_list]
Run Code Online (Sandbox Code Playgroud)

  • 使用`defaultdict`,您无需检查字典中是否有键;) (2认同)