【问题标题】:Python - restructure dictionary of lits in a loopPython - 在循环中重构光照字典
【发布时间】:2020-11-09 13:24:59
【问题描述】:

大家好,我有一个 dict id_dict,其中有一些键。在此键中有列表作为值(有时只有一项有时 4)。 (这些是组件的名称)

我的字典 id_dict 是动态创建的,键和值总是会改变。

【问题讨论】:

  • 请注意,无论如何,您还会在列表中附加第二个和第三个元素

标签: python list loops dictionary for-loop


【解决方案1】:
S = {'G': ['crypto'], 'T': ['update', 'monitor', 'ipforum'], 'F': ['update'], 'M': ['crypto','update']}

R = {}
for key, value_list in S.items():
    for value in value_list:
        if value not in R:
            R[value] = []
        R[value].append(key)

print(R)

输出:

{'crypto': ['G', 'M'], 'update': ['T', 'F', 'M'], 'monitor': ['T'], 'ipforum': ['T']}

【讨论】:

  • 使用R = defaultdict(list)
  • 我故意排除了它,因为它需要额外的导入
  • @SerialLazer 你对这个案例的单元测试有什么想法吗?任何有意义的断言?
【解决方案2】:

您实际上是在尝试将您正在迭代的组件列表分配为字典的键,这就是导致错误的原因。 尝试简单地做:

            component_dict[component] = id

【讨论】:

  • {'update': ['T'], 'monitor': ['T'], 'ipforum': ['T']}
  • 我只得到这个@Jotes
【解决方案3】:

也许可以试试:

new_dic = {}

for k, v in dic.items():
    for ele in v:
        if ele not in new_dic:
            new_dic[ele] = []
        new_dic[ele].append(k)
new_dic

注意附加

【讨论】:

    【解决方案4】:

    您似乎调用 components 而不是 component 并且不能是 dict 键,这就是导致错误的原因, 此外,您没有将其设置为列表而只是分配了值,您需要分配一个不存在的列表,如果存在则附加到它

    所以:

    If dict_components.get(component):
        dict_components[component].append(id)
    else: 
        dict_components[component] = [id]
    

    【讨论】:

      【解决方案5】:

      试试这个

      from collections import defaultdict
      
      d = {'G': ['crypto'], 'T': ['update', 'monitor', 'ipforum'], 'F': ['update'], 'M': ['crypto', 'update']}
      d1 = defaultdict(list)
      for k, v in d.items():
          for x in v:
              d1[x].append(k)
      print(d1)
      

      输出

      defaultdict(<class 'list'>, {'crypto': ['G', 'M'], 'update': ['T', 'F', 'M'], 'monitor': ['T'], 'ipforum': ['T']})
      

      【讨论】:

      • 这个也可以,但是需要额外的导入,这不是必须的,谢谢!!
      • @Newone11 虽然代码“需要额外的导入”(这是核心 python),但它使代码更短且更具可读性。它避免了if value not in R: R[value] = []
      • 我明白了,但是开头的 defaultdict( 怎么样?有没有办法不在那个对象中包含这部分?因为它看起来不太好:/我希望你了解
      • defaultdict 只是扩展了dict。您可以将其用作任何“常规”字典
      • 循环遍历d.values() 和它们到s set。最后的集合应该和d1.keys()一样
      【解决方案6】:

      最简单的方法是使用 collections.defaultdict - 这将使您免于多次测试

      from collections import defaultdict
      source = {'G': ['crypto'], 
                'T': ['update', 'monitor', 'ipforum'], 
                'F': ['update'], 
                'M': ['crypto','update']}
      
      components = defaultdict(list)
      for key, values_list in source.items():
          for value in values_list:
              components[value].append(key)
      

      结果会是

      defaultdict(list,
                  {'crypto': ['G', 'M'],
                   'update': ['T', 'F', 'M'],
                   'monitor': ['T'],
                   'ipforum': ['T']})
      

      作为替代方案,您可以创建常规 dict 并使用 setdefault 方法创建列表

      components = {}
      for key, values_list in source.items():
          for value in values_list:
              components.setdefault(value, []).append(key)
      

      【讨论】:

        猜你喜欢
        • 2014-02-14
        • 1970-01-01
        • 2018-02-22
        • 2013-10-07
        • 2018-09-29
        • 1970-01-01
        • 2020-08-03
        • 2021-07-05
        • 2023-03-12
        相关资源
        最近更新 更多