gpt4 book ai didi

python - 有条件地枚举python中字典的所有元素

转载 作者:太空宇宙 更新时间:2023-11-04 09:53:07 26 4
gpt4 key购买 nike

我有一个这样的命令:

config = {
'CONF_A': ['a1', 'a2', 'a3'],
'CONF_B': ['b1', 'b2'],
'CONF_C': {
'CONF_C1': ['c1'],
'CONF_C2': ['c21','c22']
}
}

我需要枚举 CONF_A 和 CONF_B 的所有值,首先使用 CONF_C1 中的所有值,然后使用 CONF_C2 中的所有值。例如:

('a1', 'b1', 'c1')
('a1', 'b2', 'c1')
('a2', 'b1', 'c1')
('a2', 'b2', 'c1')
('a3', 'b1', 'c1')
('a3', 'b2', 'c1')
.... same for 'c21'
.... same for 'c22'

我还需要拥有其中每一个的 key 。对于仅包含 CONF_A 和 CONF_B 的配置(见下文),我可以获得此信息,但我不确定如何枚举每个 CONF_C 元素。

>>> for x in itertools.product(*conf.itervalues()):
for k, v in itertools.izip(conf,x):
print k,v
...
CONF_A a1
CONF_B b1
CONF_A a1
CONF_B b2
CONF_A a2
CONF_B b1
CONF_A a2
CONF_B b2
CONF_A a3
CONF_B b1
CONF_A a3
CONF_B b2

注意CONF_C 元素的键应该是 'CONF_C1' 和 'CONF_C2'

----编辑----

@Patrick.Haugh 为问题的第一部分提供了这个答案:

 for x in product(config['CONF_A'], config['CONF_B'], chain.from_iterable(config['CONF_C'].values())):

这适用于获取笛卡尔积,但我仍然需要取回 key 。当我执行以下操作时:

for k, v in itertools.izip(config, x):

我得到 key CONF_A、CONF_B 和 CONF_C。然而,这些值是倒序的,例如

{'CONF_A': c1, 'CONF_B': b1, 'CONF_C': 'a1'}

此外,我正在尝试弄清楚如何确保 C 的键与 CONF_C 值匹配,即

{'CONF_A': a1, 'CONF_B': b1, 'CONF_C1': 'c1'}
{'CONF_A': a1, 'CONF_B': b1, 'CONF_C2': 'c21'}

最佳答案

使用itertools.productitertools.chain

from itertools import product, chain

list(product(config['CONF_A'], config['CONF_B'], chain.from_iterable(config['CONF_C'].values())))

给我们

[('a1', 'b1', 'c1'), ('a1', 'b1', 'c21'), ('a1', 'b1', 'c22'), ('a1', 'b2', 'c1'), 
('a1', 'b2', 'c21'), ('a1', 'b2', 'c22'), ('a2', 'b1', 'c1'), ('a2', 'b1', 'c21'),
('a2', 'b1', 'c22'), ('a2', 'b2', 'c1'), ('a2', 'b2', 'c21'), ('a2', 'b2', 'c22'),
('a3', 'b1', 'c1'), ('a3', 'b1', 'c21'), ('a3', 'b1', 'c22'), ('a3', 'b2', 'c1'),
('a3', 'b2', 'c21'), ('a3', 'b2', 'c22')]

编辑:

a_gen = (('CONF_A', a) for a in config['CONF_A'])
b_gen = (('CONF_B', b) for b in config['CONF_B'])
c_gen = ((k, e) for k, v in config['CONF_C'].items() for e in v)
for i in product(a_gen, b_gen, c_gen):
print(i)

给我们

(('CONF_A', 'a1'), ('CONF_B', 'b1'), ('CONF_C1', 'c1'))
(('CONF_A', 'a1'), ('CONF_B', 'b1'), ('CONF_C2', 'c21'))
(('CONF_A', 'a1'), ('CONF_B', 'b1'), ('CONF_C2', 'c22'))
(('CONF_A', 'a1'), ('CONF_B', 'b2'), ('CONF_C1', 'c1'))
(('CONF_A', 'a1'), ('CONF_B', 'b2'), ('CONF_C2', 'c21'))
(('CONF_A', 'a1'), ('CONF_B', 'b2'), ('CONF_C2', 'c22'))
(('CONF_A', 'a2'), ('CONF_B', 'b1'), ('CONF_C1', 'c1'))
(('CONF_A', 'a2'), ('CONF_B', 'b1'), ('CONF_C2', 'c21'))
(('CONF_A', 'a2'), ('CONF_B', 'b1'), ('CONF_C2', 'c22'))
(('CONF_A', 'a2'), ('CONF_B', 'b2'), ('CONF_C1', 'c1'))
(('CONF_A', 'a2'), ('CONF_B', 'b2'), ('CONF_C2', 'c21'))
(('CONF_A', 'a2'), ('CONF_B', 'b2'), ('CONF_C2', 'c22'))
(('CONF_A', 'a3'), ('CONF_B', 'b1'), ('CONF_C1', 'c1'))
(('CONF_A', 'a3'), ('CONF_B', 'b1'), ('CONF_C2', 'c21'))
(('CONF_A', 'a3'), ('CONF_B', 'b1'), ('CONF_C2', 'c22'))
(('CONF_A', 'a3'), ('CONF_B', 'b2'), ('CONF_C1', 'c1'))
(('CONF_A', 'a3'), ('CONF_B', 'b2'), ('CONF_C2', 'c21'))
(('CONF_A', 'a3'), ('CONF_B', 'b2'), ('CONF_C2', 'c22'))

关于python - 有条件地枚举python中字典的所有元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46957254/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com