例如,如果我在架子上有“ QOFTHEA”,我想创建从2到7的所有可能的单词长度组合,以将它们与另一个单词列表来源进行比较。我应该如何在python中创建它?
答案 0 :(得分:0)
您可以使用use itertools.permutations
和itertools.chain.from_iterable
:
from itertools import chain, permutations
rack = 'QOFTHEA'
lo, hi = 2, 7
for perm in chain.from_iterable(permutations(rack, i) for i in range(lo, hi + 1)):
print(perm)
如果您希望使用字符串而不是字符元组,则可以执行''.join(perm)
。
答案 1 :(得分:0)
而不是检查一长串所有的排列(对于7个字母,{5912
是好的,但是对于10个字母,4 037 912
的可能性是没有争议的)。我建议对照字母检查列表(复杂度现在取决于列表的长度,根据定义,列表的长度比所有排列都短)。这样可以避免将整个字典加载到内存中,因为它可能很大:
from collections import Counter
rack = Counter('QOFTHEA')
with open('words.txt') as f:
for word in (i[:-1] for i in f):
if len(word) > len(rack):
continue
word_counter = Counter(word)
for l, c in word_counter.items():
if l not in rack:
break
else:
if c > rack[l]:
break
else:
print(word)
如果由于某种原因您不想使用标准库:
def Counter(iterable):
dic = {}
for i in iterable:
if i not in dic:
dic[i] = 1
dic[i] += 1
return dic
好乱!