【问题标题】:Create combinations from two lists and create dictionary with separate key in Python从两个列表创建组合并在 Python 中使用单独的键创建字典
【发布时间】:2021-11-29 07:29:39
【问题描述】:

我有两个列表 t1 = ['C1','C2','C3'] t2 = ['提升','下降','恒定']

使用两个列表,我希望输出如下。有所有可能的组合

{
  'regime_1' : {
    'c1' : 'rising',
    'c2' : 'falling',
    'c3' : 'constant'
  },
    'regime_2' : {
    'c1' : 'rising',
    'c2' : 'falling',
    'c3' : 'falling'
  }
}

t1 列表中的元素不应在“regime”键中重复。我在python中编写了以下代码。

import itertools
t1 = ['C1', 'C2', 'C3']
t2 = ['raising', 'faling', 'constant']
combos = [str(i) +":"+ str(n) for i in t1 for n in t2]
combinations = dict(("regime_"+str(i+1),c) for i,c in enumerate(combos))

但我得到的输出是

{'regime_1': 'C1:raising', 'regime_2': 'C1:faling', 'regime_3': 'C1:constant', 'regime_4': 'C2:raising', 'regime_5': 'C2:faling', 'regime_6': 'C2:constant', 'regime_7': 'C3:raising', 'regime_8': 'C3:faling', 'regime_9': 'C3:constant'}

谢谢

【问题讨论】:

标签: python dictionary combinations itertools


【解决方案1】:

我想这就是你所追求的:

from itertools import product

variables = ['C1', 'C2', 'C3']
values = ['rising', 'falling', 'constant']

d = {f'regime_{k+1}': dict(v)
     for k, v in enumerate(
        zip(variables, v) for v in product(values, repeat=len(variables))
    )}
print(d)

一些解释:

  • product(values, repeat=len(variables)) 为您提供values 的笛卡尔积,重复数等于变量数。
  • zip() 将变量与其生成的值配对。
  • 通过枚举它们,您可以获得该制度的编号以及该制度的dict 的一组变量及其值。
  • f 字符串从枚举 (+1) 中获取数字并创建一个键,从 zip 对象创建一个字典。

结果:

{
'regime_1': {'C1': 'rising', 'C2': 'rising', 'C3': 'rising'},
'regime_2': {'C1': 'rising', 'C2': 'rising', 'C3': 'falling'},
'regime_3': {'C1': 'rising', 'C2': 'rising', 'C3': 'constant'},
'regime_4': {'C1': 'rising', 'C2': 'falling', 'C3': 'rising'},
'regime_5': {'C1': 'rising', 'C2': 'falling', 'C3': 'falling'},
'regime_6': {'C1': 'rising', 'C2': 'falling', 'C3': 'constant'},
'regime_7': {'C1': 'rising', 'C2': 'constant', 'C3': 'rising'},
'regime_8': {'C1': 'rising', 'C2': 'constant', 'C3': 'falling'},
'regime_9': {'C1': 'rising', 'C2': 'constant', 'C3': 'constant'},
'regime_10': {'C1': 'falling', 'C2': 'rising', 'C3': 'rising'},
'regime_11': {'C1': 'falling', 'C2': 'rising', 'C3': 'falling'},
'regime_12': {'C1': 'falling', 'C2': 'rising', 'C3': 'constant'},
'regime_13': {'C1': 'falling', 'C2': 'falling', 'C3': 'rising'},
'regime_14': {'C1': 'falling', 'C2': 'falling', 'C3': 'falling'},
'regime_15': {'C1': 'falling', 'C2': 'falling', 'C3': 'constant'},
'regime_16': {'C1': 'falling', 'C2': 'constant', 'C3': 'rising'},
'regime_17': {'C1': 'falling', 'C2': 'constant', 'C3': 'falling'},
'regime_18': {'C1': 'falling', 'C2': 'constant', 'C3': 'constant'},
'regime_19': {'C1': 'constant', 'C2': 'rising', 'C3': 'rising'},
'regime_20': {'C1': 'constant', 'C2': 'rising', 'C3': 'falling'},
'regime_21': {'C1': 'constant', 'C2': 'rising', 'C3': 'constant'},
'regime_22': {'C1': 'constant', 'C2': 'falling', 'C3': 'rising'},
'regime_23': {'C1': 'constant', 'C2': 'falling', 'C3': 'falling'},
'regime_24': {'C1': 'constant', 'C2': 'falling', 'C3': 'constant'},
'regime_25': {'C1': 'constant', 'C2': 'constant', 'C3': 'rising'},
'regime_26': {'C1': 'constant', 'C2': 'constant', 'C3': 'falling'},
'regime_27': {'C1': 'constant', 'C2': 'constant', 'C3': 'constant'}
}

【讨论】:

    【解决方案2】:
    import re
    import itertools
    
    t1 = ['C1', 'C2', 'C3']
    t2 = ['raising', 'faling', 'constant']
    
    variant=0
    return_dict=dict()
    
    for current_tag1 in itertools.product(t2, repeat=len(t2)):
        return_dict['regime_%d' % variant]=dict(zip(t1,current_tag1))
        variant+=1
    
    print return_dict
    

    输出

    {
    'regime_18': {'C3': 'raising', 'C2': 'raising', 'C1': 'constant'},
    'regime_19': {'C3': 'faling', 'C2': 'raising', 'C1': 'constant'},
    'regime_16': {'C3': 'faling', 'C2': 'constant', 'C1': 'faling'},
    'regime_17': {'C3': 'constant', 'C2': 'constant', 'C1': 'faling'},
    'regime_14': {'C3': 'constant', 'C2': 'faling', 'C1': 'faling'},
    'regime_15': {'C3': 'raising', 'C2': 'constant', 'C1': 'faling'},
    'regime_12': {'C3': 'raising', 'C2': 'faling', 'C1': 'faling'},
    'regime_13': {'C3': 'faling', 'C2': 'faling', 'C1': 'faling'},
    'regime_10': {'C3': 'faling', 'C2': 'raising', 'C1': 'faling'},
    'regime_11': {'C3': 'constant', 'C2': 'raising', 'C1': 'faling'},
    'regime_4': {'C3': 'faling', 'C2': 'faling', 'C1': 'raising'},
    'regime_5': {'C3': 'constant', 'C2': 'faling', 'C1': 'raising'},
    'regime_6': {'C3': 'raising', 'C2': 'constant', 'C1': 'raising'},
    'regime_7': {'C3': 'faling', 'C2': 'constant', 'C1': 'raising'},
    'regime_0': {'C3': 'raising', 'C2': 'raising', 'C1': 'raising'},
    'regime_1': {'C3': 'faling', 'C2': 'raising', 'C1': 'raising'},
    'regime_2': {'C3': 'constant', 'C2': 'raising', 'C1': 'raising'},
    'regime_3': {'C3': 'raising', 'C2': 'faling', 'C1': 'raising'},
    'regime_8': {'C3': 'constant', 'C2': 'constant', 'C1': 'raising'},
    'regime_9': {'C3': 'raising', 'C2': 'raising', 'C1': 'faling'},
    'regime_23': {'C3': 'constant', 'C2': 'faling', 'C1': 'constant'},
    'regime_22': {'C3': 'faling', 'C2': 'faling', 'C1': 'constant'},
    'regime_21': {'C3': 'raising', 'C2': 'faling', 'C1': 'constant'},
    'regime_20': {'C3': 'constant', 'C2': 'raising', 'C1': 'constant'},
    'regime_26': {'C3': 'constant', 'C2': 'constant', 'C1': 'constant'},
    'regime_25': {'C3': 'faling', 'C2': 'constant', 'C1': 'constant'},
    'regime_24': {'C3': 'raising', 'C2': 'constant', 'C1': 'constant'}
    }
    
    

    【讨论】:

    • 排列不包括重复值,但 OP 的示例确实包含这些。
    • @Grismar 是的,谢谢纠正
    【解决方案3】:
    from itertools import product, zip_longest
    t1 = ['C1', 'C2', 'C3'] 
    t2 = ['raising', 'falling', 'constant']
    t2 = product(t2,repeat=len(t1))
    result = {f"regime_{idx}":dict(zip(*value)) for idx,value in enumerate(zip_longest([t1],t2,fillvalue=t1),1)}
    print(result)
    
    {'regime_1': {'C1': 'raising', 'C2': 'raising', 'C3': 'raising'},
     'regime_2': {'C1': 'raising', 'C2': 'raising', 'C3': 'falling'},
     'regime_3': {'C1': 'raising', 'C2': 'raising', 'C3': 'constant'},
     'regime_4': {'C1': 'raising', 'C2': 'falling', 'C3': 'raising'},
     'regime_5': {'C1': 'raising', 'C2': 'falling', 'C3': 'falling'},
     'regime_6': {'C1': 'raising', 'C2': 'falling', 'C3': 'constant'},
     'regime_7': {'C1': 'raising', 'C2': 'constant', 'C3': 'raising'},
     'regime_8': {'C1': 'raising', 'C2': 'constant', 'C3': 'falling'},
     'regime_9': {'C1': 'raising', 'C2': 'constant', 'C3': 'constant'},
     'regime_10': {'C1': 'falling', 'C2': 'raising', 'C3': 'raising'},
     'regime_11': {'C1': 'falling', 'C2': 'raising', 'C3': 'falling'},
     'regime_12': {'C1': 'falling', 'C2': 'raising', 'C3': 'constant'},
     'regime_13': {'C1': 'falling', 'C2': 'falling', 'C3': 'raising'},
     'regime_14': {'C1': 'falling', 'C2': 'falling', 'C3': 'falling'},
     'regime_15': {'C1': 'falling', 'C2': 'falling', 'C3': 'constant'},
     'regime_16': {'C1': 'falling', 'C2': 'constant', 'C3': 'raising'},
     'regime_17': {'C1': 'falling', 'C2': 'constant', 'C3': 'falling'},
     'regime_18': {'C1': 'falling', 'C2': 'constant', 'C3': 'constant'},
     'regime_19': {'C1': 'constant', 'C2': 'raising', 'C3': 'raising'},
     'regime_20': {'C1': 'constant', 'C2': 'raising', 'C3': 'falling'},
     'regime_21': {'C1': 'constant', 'C2': 'raising', 'C3': 'constant'},
     'regime_22': {'C1': 'constant', 'C2': 'falling', 'C3': 'raising'},
     'regime_23': {'C1': 'constant', 'C2': 'falling', 'C3': 'falling'},
     'regime_24': {'C1': 'constant', 'C2': 'falling', 'C3': 'constant'},
     'regime_25': {'C1': 'constant', 'C2': 'constant', 'C3': 'raising'},
     'regime_26': {'C1': 'constant', 'C2': 'constant', 'C3': 'falling'},
     'regime_27': {'C1': 'constant', 'C2': 'constant', 'C3': 'constant'}}
    

    【讨论】:

    • 您的答案不包括生成 OP 所需的各种值组合的方法? (他们建议“所有可能的组合”,尽管看起来他们真的是在追求产品)
    • 谢谢,我在阅读问题时错过了这一点。现已更正
    猜你喜欢
    • 2017-06-10
    • 1970-01-01
    • 2017-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多