Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
给定输入字符串的字典值的所有可能组合。python_Python_Dictionary_Combinations_Itertools - Fatal编程技术网

给定输入字符串的字典值的所有可能组合。python

给定输入字符串的字典值的所有可能组合。python,python,dictionary,combinations,itertools,Python,Dictionary,Combinations,Itertools,我试图从给定特定键的字典中的值中获取所有可能的字符串。例如,“A”可以表示“aaa”、“aba”或“aac”,而“B”可以表示“bbb”、“bab”或“bbc”等 我给出了一个输出示例,其中显示了可能字符串的大多数组合 import itertools in_ = 'ABC' D = {'A':['aaa','aba','aac'],'B':['bbb','bab','bbc'],'C':['ccc','cac','ccb']} #out_ = ['aaabbbccc','ababbbccc'

我试图从给定特定键的字典中的值中获取所有可能的字符串。例如,“A”可以表示“aaa”、“aba”或“aac”,而“B”可以表示“bbb”、“bab”或“bbc”等

我给出了一个输出示例,其中显示了可能字符串的大多数组合

import itertools
in_ = 'ABC'
D = {'A':['aaa','aba','aac'],'B':['bbb','bab','bbc'],'C':['ccc','cac','ccb']}

#out_ = ['aaabbbccc','ababbbccc','aacbbbccc','aaababccc','aaabbcccc','aaabbbcac','aaabbbccb'...]
我开始编写代码,但它开始变得非常混乱,我觉得有一种方法可以使用itertools或其他更具Python风格的工具来实现这一目标

output = []
for char in in_:
    out_string = ''
    while char:
        for v in D[char]:
            while v:
                for char2 in in_:
                    out_string
#not pythonic . . . 

嗯,您已经在那里导入了
itertools
。让我们用它!我们需要笛卡尔积
D['A']×D['B']×D['C']
,因此我们将使用
itertools.product
精确地实现这一点

import itertools

in_ = 'ABC'
D = {'A':['aaa','aba','aac'],'B':['bbb','bab','bbc'],'C':['ccc','cac','ccb']}

iterables = [D[character] for character in in_]
out_ = [''.join(tup) for tup in itertools.product(*iterables)]
现在,
out.
是:

['aaabbbccc', 'aaabbbcac', 'aaabbbccb', 'aaababccc', 'aaababcac', 'aaababccb', 
 'aaabbcccc', 'aaabbccac', 'aaabbcccb', 'ababbbccc', 'ababbbcac', 'ababbbccb', 
 'abababccc', 'abababcac', 'abababccb', 'ababbcccc', 'ababbccac', 'ababbcccb', 
 'aacbbbccc', 'aacbbbcac', 'aacbbbccb', 'aacbabccc', 'aacbabcac', 'aacbabccb', 
 'aacbbcccc', 'aacbbccac', 'aacbbcccb']

这就是你想要的结果吗?

难以置信,非常感谢!我知道itertools是一条发展之路,但我不知道该产品能产生这样的结果。iterables对iterables做了什么?iterables是。所以
product(*iterables)
相当于
product(iterables[0],iterables[1],…)
,只是你不需要事先知道iterables有多少个元素。有没有办法把它变成一个生成器,这样它就不会占用那么多空间?
itertools.product
已经返回了一个迭代器,因此,您需要做的就是将列表理解的方括号
[]
替换为生成器理解的
()