【问题标题】:Convert list to dictionary with duplicate keys using dict comprehension使用字典理解将列表转换为具有重复键的字典
【发布时间】:2016-12-15 13:43:13
【问题描述】:

大家好,

我正在尝试使用以下内容将长度为 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_dict['c'] 得到什么回报?
  • for (key, value) in my_list 不应该工作
  • @MMF:为什么不呢? my_list 中的每个元素在迭代时都有两个值。
  • @Patrick 是的,没想到。尴尬。
  • @MMF 确实如此。字符串是可迭代的,可以解包

标签: python python-2.7


【解决方案1】:

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

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

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

【讨论】:

  • 使用defaultdict,您无需检查字典中是否有键;)
  • @MMF 没有异议。
  • 更好的是,只需new_dict.setdefault(key, []).append(value)
  • @AaditMShah 在答案中添加您和 MMF 的输入。
【解决方案2】:

如果您不关心 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']}

【讨论】:

  • itertools.groupby,但是“一般来说,iterable 需要已经在同一个键函数上排序。”这使得函数几乎没用。
【解决方案3】:

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

【讨论】:

  • 更好的是,只需使用普通字典执行my_dict.setdefault(k, []).append(v)
猜你喜欢
  • 2022-01-19
  • 2020-04-12
  • 2015-04-03
  • 1970-01-01
  • 2017-12-11
  • 1970-01-01
  • 1970-01-01
  • 2016-08-03
  • 1970-01-01
相关资源
最近更新 更多