Python 使用dict comprehension将列表转换为具有重复键的字典

Python 使用dict comprehension将列表转换为具有重复键的字典,python,python-2.7,Python,Python 2.7,大家好 我正在尝试使用以下方法将长度为2的项目列表转换为字典: my_list = ["b4", "c3", "c5"] my_dict = {key: value for (key, value) in my_list} 问题是,当一个键出现在列表中不止一个时,只保留最后一个键及其值 因此,在这种情况下 my_dict = {'c': '3', 'c': '5', 'b': '4'} 我明白了 my_dict = {'c': '5', 'b': '4'} 即使存在重复的键,如何保留所有键

大家好

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

my_list = ["b4", "c3", "c5"]
my_dict = {key: value for (key, value) in my_list}
问题是,当一个键出现在列表中不止一个时,只保留最后一个键及其值

因此,在这种情况下

my_dict = {'c': '3', 'c': '5', 'b': '4'}
我明白了

my_dict = {'c': '5', 'b': '4'}
即使存在重复的键,如何保留所有键:值对。
感谢字典中的一个键,您只能存储一个值

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

{'b': ['4'], 'c': ['3', '5']}
以下代码将为您执行此操作:

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']}
使用
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']}
使用
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']})
下面的代码将为您执行此操作

new_list = [{key: value} for (key, value) in my_list]

您可以使用
defaultdict
来避免检查关键字是否在字典中:

from collections import defaultdict

my_dict = defaultdict(list)
for k, v in my_list:
    my_dict[k].append(v)
输出:

defaultdict(list, {'b': ['4'], 'c': ['3', '5']})

如果您不关心
O(n^2)
渐近行为,您可以使用dict理解,包括列表理解:

>>> {key: [i[1] for i in my_list if i[0] == key] for (key, value) in my_list}
{'b': ['4'], 'c': ['3', '5']}
或者该函数(可能比使用
collections.defaultdict
更快):


对于
my_dict['c']
,您希望得到什么回报?
对于my_列表中的(键、值)
不应该是working@MMF:为什么不呢?当迭代时,
my_list
中的每个元素都有两个值。@Patrick是的,没有想到这一点。不好意思。@MMF当然了。字符串是可编辑的,可以使用
defaultdict
解包,您无需检查字典中是否有键;)@MMF在这方面没有异议。更好的是,只需执行
new_dict.setdefault(key,[])。append(value)
@AaditMShah在答案中添加您和MMF的输入。更好的是,只需使用常规字典执行
my_dict.setdefault(k,[])。append(v)
>>> {key: [i[1] for i in my_list if i[0] == key] for (key, value) in my_list}
{'b': ['4'], 'c': ['3', '5']}
>>> from iteration_utilities import groupedby
>>> from operator import itemgetter
>>> groupedby(my_list, key=itemgetter(0), keep=itemgetter(1))
{'b': ['4'], 'c': ['3', '5']}