【问题标题】:Creating subset of the dict elements having {key:list[]}创建具有 {key:list[]} 的 dict 元素的子集
【发布时间】:2020-03-20 21:34:35
【问题描述】:

我有一个包含每个键的列表元素的字典。例如。

config_dict = {"num":[2,3,4],
               "dist":[10,30,22],
               "type":["free"],
               "uphill":[1e-3, 1e-2, 1e-6]
               }

我想创建一个函数,它为每个键创建所有可能的元素子集作为新字典。例如

new_config = {'congfig_1': { "num":2,
                             "dist":22,
                             "type":"free",
                             "uphill":1e-3
                           }
              'config_2': { "num":3,
                             "dist":22,
                             "type":"free",
                             "uphill":1e-6
                           }
              'config_3': { "num":2,
                             "dist":10,
                             "type":"free",
                             "uphill":1e-3
                           }
               ...
              }

我被困在实现上,因为每个键可能有不同长度的列表。有没有一种优雅的方式来做到这一点/没有很多循环的pythonic方式?

【问题讨论】:

  • 将输出作为字典列表不是有意义吗?
  • 是的。这也有效。我按照我想象的方式打字

标签: python-3.x list dictionary data-structures


【解决方案1】:

你可以使用itertools.product:

from itertools import product

config_dict = {"num":[2,3,4],
               "dist":[10,30,22],
               "type":["free"],
               "uphill":[1e-3, 1e-2, 1e-6]
               }

output = {f'config_{i}': {'num': num, 'dist': dist, 'type': type, 'uphill': uphill}
         for i, (num, dist, type, uphill) in enumerate(product(*config_dict.values()), 1)}

print(output)

但是,创建一个字典列表可能更有意义:

output = [{'num': num, 'dist': dist, 'type': type, 'uphill': uphill}
          for (num, dist, type, uphill) in product(*config_dict.values())]

【讨论】:

  • 有没有办法明确地省略写键?我确实得到了这个工作。但是每次我在字典中添加一个新键时,我也必须在这里明确地写出来
  • 我认为我们可以做到。我已经添加了一个答案。在你的 ans 中标记它以供将来参考。
【解决方案2】:

补充@DeepSpace 的答案 我们可以通过

防止在创建这个新字典时显式键入键
config_keys = config_dict.keys()
for i, values in product(*config_dict.values()):
   output[f'config_{i}'] = dict(zip(config_keys, values))

【讨论】:

    【解决方案3】:

    如果你想在没有库的情况下编写

    def combinatrix(dictLeft):
        sol=list()
        key=list(dictLeft.keys())[0]
        temp2=dict(dictLeft)
        del temp2[key]
        if(len(temp2)==0):
            for item in dictLeft.get(key):
                temp=dict()
                temp[key]=item
                sol.append(temp)
        else:
            a=combinatrix(temp2)
            for item in dictLeft.get(key):
                for b in a:
                    b=dict(b)
                    b[key]=item
                    sol.append(b)
        return sol
    
    config_dict = {"num":[2,3,4],
                   "dist":[10,30,22],
                   "type":["free"],
                   "uphill":[1e-3, 1e-2, 1e-6]
                   }
    
    sol=combinatrix(config_dict)
    print(sol)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-25
      • 1970-01-01
      • 1970-01-01
      • 2013-06-11
      • 1970-01-01
      相关资源
      最近更新 更多