簡體   English   中英

將 dict 轉換為每個組合的 dict 列表

[英]Convert dict to list of dict for each combinations

我有一個 dict 看起來像這樣:

my_dict = {
    "a":[1, 2, 3],
    "b":[10],
    "c":[4, 5],
    "d":[11]
}

我想獲得一個包含所有組合的列表,保持鍵和值,如下所示:

result = [
    {"a":1, "b":10, "c":4, "d":11},
    {"a":1, "b":10, "c":5, "d":11},
    {"a":2, "b":10, "c":4, "d":11},
    {"a":2, "b":10, "c":5, "d":11},
    {"a":3, "b":10, "c":4, "d":11},
    {"a":3, "b":10, "c":5, "d":11}
]

有人對此有解決方案嗎? 是否有任何現有的解決方案可以做到這一點,或者我應該如何自己進行?

謝謝你。

itertools.product的任務:

>>> from itertools import product
>>> for dict_items in product(*[product([k],v) for k, v in my_dict.items()]):
...    print(dict(dict_items))

{'a': 1, 'b': 10, 'c': 4, 'd': 11}
{'a': 1, 'b': 10, 'c': 5, 'd': 11}
{'a': 2, 'b': 10, 'c': 4, 'd': 11}
{'a': 2, 'b': 10, 'c': 5, 'd': 11}
{'a': 3, 'b': 10, 'c': 4, 'd': 11}
{'a': 3, 'b': 10, 'c': 5, 'd': 11}

小說明:

product(...)會將字典擴展為一個列表,例如[[(k1, v11), (k1, v12), ...], [(k2, v21), (k2, v22), ...], ...]

外部product(...)將通過從每個列表中選擇一個元組來重新組合項目列表。

dict(...)將從一系列(k1, v#), (k2, v#), ...元組中創建一個字典。

嘗試:

def permute(d):
    k = d.keys()
    perms = itertools.product(*d.values())
    return [dict(zip(k, v)) for v in perms]

用法示例:

>>> d = {'a': [1, 2, 3], 'b': [10], 'c': [4, 5], 'd': [11]}

>>> pprint(permute(d))
[{'a': 1, 'b': 10, 'c': 4, 'd': 11},
 {'a': 1, 'b': 10, 'c': 5, 'd': 11},
 {'a': 2, 'b': 10, 'c': 4, 'd': 11},
 {'a': 2, 'b': 10, 'c': 5, 'd': 11},
 {'a': 3, 'b': 10, 'c': 4, 'd': 11},
 {'a': 3, 'b': 10, 'c': 5, 'd': 11}]

假設您只對具有 4 個鍵的 my_dict 感興趣,那么使用嵌套 for 循環就足夠簡單了:

my_dict = {
    "a": [1, 2, 3],
    "b": [10],
    "c": [4, 5],
    "d": [11]
}

result = []
for a_val in my_dict['a']:
    for b_val in my_dict['b']:
        for c_val in my_dict['c']:
            for d_val in my_dict['d']:
                result.append({'a': a_val, 'b': b_val, 'c': c_val, 'd': d_val})

print(result)

這給出了預期的結果。

您可以使用:

from itertools import product
allNames = sorted(my_dict)
values= list(product(*(my_dict[Name] for Name in allNames)))
d = list(dict(zip(['a','b','c','d'],i)) for i in values)

輸出:

[{'a': 1, 'c': 4, 'b': 10, 'd': 11}, 
{'a': 1, 'c': 5, 'b': 10, 'd': 11}, 
{'a': 2, 'c': 4, 'b': 10, 'd': 11}, 
{'a': 2, 'c': 5, 'b': 10, 'd': 11}, 
{'a': 3, 'c': 4, 'b': 10, 'd': 11}, 
{'a': 3, 'c': 5, 'b': 10, 'd': 11}]

itertools.product生成迭代器列表的組合。

dict.values()獲取所需的列表。

對於每個組合,用組合zip dict.keys()

使用list comprehension來收集它們:

from itertools import product
from pprint import pprint

my_dict = {
    "a":[1, 2, 3],
    "b":[10],
    "c":[4, 5],
    "d":[11]
}

result = [dict(zip(my_dict,i)) for i in product(*my_dict.values())]
pprint(result)

輸出:

[{'a': 1, 'b': 10, 'c': 4, 'd': 11},
 {'a': 1, 'b': 10, 'c': 5, 'd': 11},
 {'a': 2, 'b': 10, 'c': 4, 'd': 11},
 {'a': 2, 'b': 10, 'c': 5, 'd': 11},
 {'a': 3, 'b': 10, 'c': 4, 'd': 11},
 {'a': 3, 'b': 10, 'c': 5, 'd': 11}]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM