【问题标题】:Add multiple values to a dictionary key向字典键添加多个值
【发布时间】:2017-10-24 10:21:44
【问题描述】:

我有两个列表:

list1 = ['670', '619', '524', '670', '693', '693', '693', '632', '671']
list2 = ['JAIPUR', 'MUMBAI', 'DELHI', 'UDAIPUR', 'GOA', 'GOA', 'GOA', 'LUCKNOW', 'JAIPUR']

我想用这个做一本字典。 请注意这两个列表完全按照它应该映射到的顺序。就像键'670'值我们'JAIPUR'等等。

但是当我尝试时,它给出的输出为:

d = dict(zip(list1, list2))

{'670': 'UDAIPUR', '619': 'MUMBAI', '524': 'DELHI', '693': 'GOA', '632': 'LUCKNOW', '671': 'JAIPUR'}

如果为单个键找到多个值,则只取最新的值。 但是我想要的是像 670 这样的单个键应该有多个值:

'670': ['JAIPUR', 'UDAIPUR']

谁能帮忙。

【问题讨论】:

  • dict 对象关联键值对,其中键是唯一的。但是,您的值可以是容器本身,例如 list 或 tuple。
  • 有逻辑吗?在共享的示例中,您在 list1 和 list2 中有相同数量的元素。
  • 如何确定list2 中的哪些元素应该映射到list1 中的每个键?更新您的问题,您可能会得到更多有用的答案。

标签: python list dictionary data-structures


【解决方案1】:

使用defaultdict:

>>> from collections import defaultdict
>>> d = defaultdict(list)
>>> for i,key in enumerate(list1): 
        if list2[i] not in d[key]:            #to add only unique values (ex: '693':'goa')
            d[key].append(list2[i]) 

>>> d
=> defaultdict(<class 'list'>, {'670': ['JAIPUR', 'UDAIPUR'], '619': ['MUMBAI'], 
               '524': ['DELHI'], '693': ['GOA'], '632': ['LUCKNOW'], '671': ['JAIPUR']})

【讨论】:

  • 这正是我想要的。还会删除任何重复的值。完美的 !谢谢
  • @VinnyKaur :很高兴为您提供帮助
  • @mrCarnivore : defaultdict 只不过是对 dict 的包装,因此它提供了一些额外的功能,但它从 dict 开始的所有基本结构也完好无损。
  • @KaushikNP 你能解释一下enumerate(list1)在这里做的部分吗
  • @VinnyKaur :在此处迭代list 时,它用于访问Index 和elements。您可以通过:Iterate a list with indexes in Python 了解有关其使用方式的更好示例。
【解决方案2】:

您需要按list1 项目分组。使用collections.defaultdict对象:

import collections

list1 = ['670', '619', '524', '670', '693', '693', '693', '632', '671']
list2 = ['JAIPUR', 'MUMBAI', 'DELHI', 'UDAIPUR', 'GOA', 'GOA', 'GOA', 'LUCKNOW', 'JAIPUR']
result = collections.defaultdict(list)

for t in zip(list1, list2):
    result[t[0]].append(t[1])

print(dict(result))

输出:

{'524': ['DELHI'], '671': ['JAIPUR'], '632': ['LUCKNOW'], '670': ['JAIPUR', 'UDAIPUR'], '619': ['MUMBAI'], '693': ['GOA', 'GOA', 'GOA']}

【讨论】:

  • 它如何将 list1 识别为 t[0] 并将 list2 识别为 t[1]。如果这个问题听起来很愚蠢,我们深表歉意,但 python 对我来说是新的。
  • @VinnyKaur, zip() 函数生成一个元组列表/生成器,其中每个元组包含来自所有传递的可迭代对象的连续值,例如(670, 'JAIPUR'), (619, 'MUMBAI') ...
【解决方案3】:

由于 dicts 不能有多个具有相同键的元素,因此分配给 dict 的该键的新值会覆盖旧值。

因此,使用此代码可以正常工作:

list1 = ['670', '619', '524', '670', '693', '693', '693', '632', '671']
list2 = ['JAIPUR', 'MUMBAI', 'DELHI', 'UDAIPUR', 'GOA', 'GOA', 'GOA', 'LUCKNOW', 'JAIPUR']

def extendDictValue(d, key, value):
    if key in d:
        d[key].append(value)
    else:
        d[key] = [value]

d={}
for key, value in zip(list1, list2):
    extendDictValue(d, key, value)

print(d)

【讨论】:

    猜你喜欢
    • 2022-07-25
    • 2015-08-24
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 2020-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多