代码之家  ›  专栏  ›  技术社区  ›  user58925

Python创建字典的组合

  •  -2
  • user58925  · 技术社区  · 5 年前

    我想转换以下形式的Python词典:

    D = {'a':[1,2,3], 'b':[0.1,0.5], 'c':[10,20]}
    

    E = [{a:1,b:0.1,c:10}, {a:1,b:0.1,c:20},{a:1,b:0.5,c:10}, ...., {a:3,b:0.5,c:20}]
    

    我试过使用itertools,但不知道如何用它来组合字典。

    0 回复  |  直到 5 年前
        1
  •  2
  •   U13-Forward    5 年前

    为什么不只是:

    from itertools import product
    D = {'a':[1,2,3], 'b':[0.1,0.5], 'c':[10,20]}
    print([dict(zip(D.keys(),v)) for v in product(*D.values())])
    

    输出:

    [{'a': 1, 'b': 0.1, 'c': 10}, {'a': 1, 'b': 0.1, 'c': 20}, {'a': 1, 'b': 0.5, 'c': 10}, {'a': 1, 'b': 0.5, 'c': 20}, {'a': 2, 'b': 0.1, 'c': 10}, {'a': 2, 'b': 0.1, 'c': 20}, {'a': 2, 'b': 0.5, 'c': 10}, {'a': 2, 'b': 0.5, 'c': 20}, {'a': 3, 'b': 0.1, 'c': 10}, {'a': 3, 'b': 0.1, 'c': 20}, {'a': 3, 'b': 0.5, 'c': 10}, {'a': 3, 'b': 0.5, 'c': 20}]
    
        2
  •  3
  •   Christian Sloper    5 年前

    这里有一个解决方案:

    import itertools
    
    D = {'a':[1,2,3], 'b':[0.1,0.5], 'c':[10,20]}
    
    E = [dict(zip(D.keys(), a)) for a in itertools.product(*D.values())]
    

    E= [{'a': 1, 'b': 0.1, 'c': 10},
     {'a': 1, 'b': 0.1, 'c': 20},
     {'a': 1, 'b': 0.5, 'c': 10},
     {'a': 1, 'b': 0.5, 'c': 20},
     {'a': 2, 'b': 0.1, 'c': 10},
     {'a': 2, 'b': 0.1, 'c': 20},
     {'a': 2, 'b': 0.5, 'c': 10},
     {'a': 2, 'b': 0.5, 'c': 20},
     {'a': 3, 'b': 0.1, 'c': 10},
     {'a': 3, 'b': 0.1, 'c': 20},
     {'a': 3, 'b': 0.5, 'c': 10},
     {'a': 3, 'b': 0.5, 'c': 20}]
    

    编辑:正如Aran指出的,以下是支持它的文档: Python dictionary: are keys() and values() always the same order?

        3
  •  1
  •   Ralf    5 年前

    itertools 让它工作。

    >>> origin = {
        'a': [1, 2, 3],
        'b': [0.1, 0.5],
        'c': [10, 20],
    }
    >>> result = [
        {
            'a': a,
            'b': b,
            'c': c,
        }
        for a in origin['a']
        for b in origin['b']
        for c in origin['c']]
    >>> result
    [{'a': 1, 'b': 0.1, 'c': 10}, {'a': 1, 'b': 0.1, 'c': 20},
     {'a': 1, 'b': 0.5, 'c': 10}, {'a': 1, 'b': 0.5, 'c': 20},
     {'a': 2, 'b': 0.1, 'c': 10}, {'a': 2, 'b': 0.1, 'c': 20},
     {'a': 2, 'b': 0.5, 'c': 10}, {'a': 2, 'b': 0.5, 'c': 20},
     {'a': 3, 'b': 0.1, 'c': 10}, {'a': 3, 'b': 0.1, 'c': 20},
     {'a': 3, 'b': 0.5, 'c': 10}, {'a': 3, 'b': 0.5, 'c': 20}]
    
        4
  •  1
  •   user58925    5 年前

    parameter_values_each = {'a':[1,2,3], 'b':[0.1,0.5], 'c':[10,20]}
    
    param_possibilities = []
    for name in parameter_values_each:
        temp = []
        for val in parameter_values_each[name]:
            temp.append((name,val))
        param_possibilities.append(temp)
    
    
    result = list(itertools.product(*param_possibilities))
    
    print result
    
        5
  •  0
  •   Alex Lopatin    5 年前

    路途遥远,无路可走 产品

    D = {'a': [1, 2, 3], 'b': [0.1, 0.5], 'c': [10, 20]}
    E = []
    
    list_of_keys = list(D.keys())
    list_of_lengths = [len(D[key]) for key in list_of_keys]
    
    product_number = 1
    for length in list_of_lengths:
        product_number *= length
    
    for n in range(product_number):
        index = n
        index_list = []
        for length in reversed(list_of_lengths):
            index_list.insert(0, index % length)
            index = index // length
        keys_with_values = {}
        for j, key in enumerate(list_of_keys):
            keys_with_values[key] = D[key][index_list[j]]
        E.append(keys_with_values)
    
    for e in E:
        print(e)
    

    结果:

    {'a': 1, 'b': 0.1, 'c': 10}
    {'a': 1, 'b': 0.1, 'c': 20}
    {'a': 1, 'b': 0.5, 'c': 10}
    {'a': 1, 'b': 0.5, 'c': 20}
    {'a': 2, 'b': 0.1, 'c': 10}
    {'a': 2, 'b': 0.1, 'c': 20}
    {'a': 2, 'b': 0.5, 'c': 10}
    {'a': 2, 'b': 0.5, 'c': 20}
    {'a': 3, 'b': 0.1, 'c': 10}
    {'a': 3, 'b': 0.1, 'c': 20}
    {'a': 3, 'b': 0.5, 'c': 10}
    {'a': 3, 'b': 0.5, 'c': 20}