我正在制作一个程序,你插入一些字母,然后输出是那些字母的所有可能组合。
例如:如果输入是" ABC"输出应该是" A"," B"," C"," AB"," AC",& #34; BC"" ABC"" ACB"等等...
最后,我的想法是将所有组合放在一个集合中,以便它可以与另一个集合交叉,其中包含某个英语单词字典,即理想输出的交集
到目前为止,我的脚本就是这个:
import random
p = list(raw_input('Insert some letters: '))
p2 = []
p3 = []
for j in range((len(p))):
p2.append(p[j])
for i in range(len(p)):
a = random.sample(p2,len(p))
p3.append(str("".join(a)))
print p3[]
显然,有一些错误而且不完整。你能帮我完成或告诉我应该走哪条路?感谢您的阅读
答案 0 :(得分:4)
如果您不关心订单,那么您正在寻找一种组合。您可以使用itertools.combination
:
import itertools
items = 'ABC'
for i in range(len(items)+1):
for combination in itertools.combinations('ABC', i):
print(combination)
列表理解版本:
[combination for i in range(len(items)+1) for combination in itertools.combinations('ABC', i)]
答案 1 :(得分:0)
我喜欢把这样的东西放到一个很好的生成器函数中,例如:
from itertools import permutations
def words(letters):
for n in range(1, len(letters)+1):
yield from map(''.join, permutations(letters, n))
然后可以方便地使用,例如:
for word in words('ABC'):
print(word)
或者因为你想要它作为一个集合:
>>> set(words('ABC'))
{'BA', 'BCA', 'CB', 'A', 'AC', 'AB', 'C', 'BC', 'CA', 'ABC', 'CBA', 'B', 'BAC', 'CAB', 'ACB'}
但是,不生成此单词集可能更好一点,但要仔细检查这些单词并检查每个单词是否可以从给定的字母中生成。取决于哪个集更大,这取决于输入字母。
答案 2 :(得分:0)
可惜我不能对斯蒂芬+1。我已经编辑了Stefan的天才答案(出于我的目的):
from itertools import permutations
def words(letters):
yield from map(''.join, permutations(letters, len(letters)))
result = set()
for word in words('algorithm'):
result.add(word)
print(f' There are {len(result)} combinations')
for i, each in enumerate(result):
if i%5 == 0 and input(''):
break
print(each)
它进行全长排列。