【问题标题】:Merge two lists into one dict that may contain several values for each key [duplicate]将两个列表合并到一个字典中,该字典可能包含每个键的多个值[重复]
【发布时间】:2021-01-11 10:43:34
【问题描述】:

我有两个列表

system = ['System A', 'System B', 'System C']
instrument = ['Instrument 1', 'Instrument 2', 'Instrument 3', 'Instrument 4']

系统项可能对应一到多个仪器项,如下所示:

dict = {'System A':['Instrument 1', 'Instrument 2'], 'System B':['Instrument 3'], 'System C':['Instrument 4']}

请注意“系统 A”如何具有一个列表值,该列表值基于 instrument 列表中的前两项

为了更好地说明我的问题:

我尝试了 dict comprehension + zip() 但显然它不起作用。这是我尝试过的:

system_data_dict = {sys:inst for sys, inst in zip(system, instrument)}

请注意,这不是 CSV 问题。我正在获取的数据来自 SQL 数据库,我需要对其进行解析

我现在正用头敲键盘,哈哈。

提前致谢

编辑:系统列表已用 set() 解析

【问题讨论】:

  • 分组是如何工作的?为什么System A 从第二个列表中同时使用Instrument 1Instrument 2,是什么阻止System B 改为使用Instrument 2Instrument 3?这里的逻辑是什么?
  • 没错。没有分配任务。程序如何知道?
  • @Chase 这是存储在数据库中的数据,我正在逐行获取它。我没有说明第一个列表是所获取数据的 set() 是一个错误。我马上修改

标签: python dictionary


【解决方案1】:

Python 没有 multidicts,所以你有两个选择:

  1. 使用现有库中的 multidicts,例如werkzeug's MultiDict,当使用对列表初始化时,会将多个值关联到多次出现的键(不像 dict 只会保留最后一个值)

    system_data_dict = werkzeug.datastructures.MultiDict(zip(system, instrument))
    system_data_dict.getlist('System A') # => ['Instrument 1', 'Instrument 2']
    
  2. 或者,使用常规循环手动执行此操作,即使使用理解(我不确定)是否可行,它也会看起来很糟糕:使用 defaultdictdict.setdefault 方法来定义将键映射到 列表 并每次都附加值

    system_data_dict = {}
    for k, v in zip(system, instrument):
       system_data_dict.setdefault(k, []).append(v)
    system_data_dict['System A'] # => ['Instrument 1', 'Instrument 2']
    

【讨论】:

  • 这解决了我的问题!谢谢
【解决方案2】:

为您的列表提供分组信息。

假设您从数据库中获取项目,

SELECT System, instrument FROM <src> WHERE System IN ("System A", "System B", "System C")

并对其进行解析以形成如下列表:

items = [("System A", "Instrument 1"), ("System A", "Instrument 2"), ("System B", "Instrument 3"), ...]

然后使用您的字典代码:

# system_data_dict = {sys:inst for sys, inst in items}

# EDIT
system_data_dict = {}
for sys, inst in items:
    if sys in system_data_dict.keys():
        system_data_dict[sys].append(inst)
    else:
        system_data_dict[sys] = [inst]

【讨论】:

  • 不起作用,如果一个键在输入中多次出现,那么只有最后一个关联的值会在最终的字典中。
  • 项目列表按预期工作,但是当我尝试将其转换为字典时,只存储最后一个(键,值)。我也试过这个:system_data_dict = {sys:[inst] for sys, inst in items} 但结果相同
  • @Masklinn 对不起。没有好好想。进行了编辑,因此该值现在是一个列表。
猜你喜欢
  • 1970-01-01
  • 2018-08-23
  • 1970-01-01
  • 2017-01-05
  • 1970-01-01
  • 2022-11-14
  • 1970-01-01
  • 2019-03-23
  • 1970-01-01
相关资源
最近更新 更多