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

时间:2016-12-15 13:43:13

标签: 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'}

即使存在重复键,如何保留所有键:值对。 感谢

3 个答案:

答案 0 :(得分:3)

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

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

{'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']})

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

[{'b': '4'}, {'c': '3'}, {'c': '5'}]

以下代码将为您执行此操作

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

答案 1 :(得分:1)

您可以使用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']})

答案 2 :(得分:1)

如果你不关心O(n^2)渐近行为,你可以使用包含列表理解的字典理解:

>>> {key: [i[1] for i in my_list if i[0] == key] for (key, value) in my_list}
{'b': ['4'], 'c': ['3', '5']}

iteration_utilities.groupedby函数(可能比使用collections.defaultdict更快):

>>> from iteration_utilities import groupedby
>>> from operator import itemgetter
>>> groupedby(my_list, key=itemgetter(0), keep=itemgetter(1))
{'b': ['4'], 'c': ['3', '5']}