字典列表 to/from 列表字典,但具有所有可能的排列
List of dicts to/from dict of lists, but with all possible permutations
来自问题编号 5558418,假设我有一本字典,其中的值是列表:
DL = {'a': [0, 1], 'b': [2, 3]}
我想将其转换为字典列表,但具有所有可能的排列。也就是说,而不是
LD = [{'a': 0, 'b': 2}, {'a': 1, 'b': 3}]
我现在想要:
LD = [{'a': 0, 'b': 2}, {'a': 0, 'b': 3}, {'a': 1, 'b': 2}, {'a': 1, 'b': 3}]
我该怎么做?我认为 itertools 的 product() 可能很方便,但我不太明白。
奖励:在我的实际问题中,有些值不是列表。我怎样才能像上面那样做,但保留所有不是列表的值?例如:
D = {'a': [0, 1], 'b': [2, 3], 'c':7, 'd':9}
变为:
L = [{'a': 0, 'b': 2, 'c':7, 'd':9}, {'a': 0, 'b': 3, 'c':7, 'd':9}}, {'a': 1, 'b': 2, 'c':7, 'd':9}}, {'a': 1, 'b': 3, 'c':7, 'd':9}}]
谢谢!
确保每个值都是一个列表,然后使用 itertools.product
:
from itertools import product
# DL = {'a': [0, 1], 'b': [2, 3]}
D = {'a': [0, 1], 'b': [2, 3], 'c': 7, 'd': 9}
res = [dict(zip(D, p)) for p in product(*[v if isinstance(v, list) else [v] for v in D.values()])]
print(res)
输出
[{'a': 0, 'b': 2, 'c': 7, 'd': 9}, {'a': 0, 'b': 3, 'c': 7, 'd': 9}, {'a': 1, 'b': 2, 'c': 7, 'd': 9}, {'a': 1, 'b': 3, 'c': 7, 'd': 9}]
来自问题编号 5558418,假设我有一本字典,其中的值是列表:
DL = {'a': [0, 1], 'b': [2, 3]}
我想将其转换为字典列表,但具有所有可能的排列。也就是说,而不是
LD = [{'a': 0, 'b': 2}, {'a': 1, 'b': 3}]
我现在想要:
LD = [{'a': 0, 'b': 2}, {'a': 0, 'b': 3}, {'a': 1, 'b': 2}, {'a': 1, 'b': 3}]
我该怎么做?我认为 itertools 的 product() 可能很方便,但我不太明白。
奖励:在我的实际问题中,有些值不是列表。我怎样才能像上面那样做,但保留所有不是列表的值?例如:
D = {'a': [0, 1], 'b': [2, 3], 'c':7, 'd':9}
变为:
L = [{'a': 0, 'b': 2, 'c':7, 'd':9}, {'a': 0, 'b': 3, 'c':7, 'd':9}}, {'a': 1, 'b': 2, 'c':7, 'd':9}}, {'a': 1, 'b': 3, 'c':7, 'd':9}}]
谢谢!
确保每个值都是一个列表,然后使用 itertools.product
:
from itertools import product
# DL = {'a': [0, 1], 'b': [2, 3]}
D = {'a': [0, 1], 'b': [2, 3], 'c': 7, 'd': 9}
res = [dict(zip(D, p)) for p in product(*[v if isinstance(v, list) else [v] for v in D.values()])]
print(res)
输出
[{'a': 0, 'b': 2, 'c': 7, 'd': 9}, {'a': 0, 'b': 3, 'c': 7, 'd': 9}, {'a': 1, 'b': 2, 'c': 7, 'd': 9}, {'a': 1, 'b': 3, 'c': 7, 'd': 9}]