Python 使用dict comprehension将列表转换为具有重复键的字典
大家好 我正在尝试使用以下方法将长度为2的项目列表转换为字典: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'} 即使存在重复的键,如何保留所有键
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']}