我试图弄清楚如果给定多个值,我可以在应用于模板/模式时生成值的所有组合。所以,如果我有以下变量:
pattern = '{name} likes {animal}s'
options = {'name': ['Alex', 'Sarah', 'Bob'], 'animal': ['cat', 'dog']}
我想让代码打印出基于字符串模式和字典中的值(或任何其他结构,无关紧要)的所有可能组合。
'Alex likes cats'
'Alex likes dogs'
'Sarah likes cats'
'Sarah likes dogs'
'Bob likes cats'
'Bob likes dogs'
我可以想办法做到这一点,但它很混乱,而且我试图在没有硬编码的情况下找到一种方法来做到这一点,所以将来我可以引入一个新的密钥,比如“颜色”,而不必改变除pattern
和options
我假设我可以使用与this code I found类似的东西:
def combine(template, options):
for opts in itertools.product(*options):
yield template.format(*opts)
但我无法弄清楚如何获得所有组合并将其保持为string.format()
将接受的格式。我确信有一些简单的解决方案我会忽略。
答案 0 :(得分:3)
所以我在遇到另一个问题后发现了这个问题,我会把它留下来以防万一这有助于其他人:
def combine(template, options)
products = [dict(zip(options, values)) for values in itertools.product(*options.values())]
return [template.format(**p) for p in products]