问题描述
我试图从输入中生成可能的字符串列表,考虑通配符“?”和 ”*”。列表项的排序应该无关紧要,这意味着如果列表中已经存在 ABC,那么我不想添加 ACB 或任何其他排序(处理速度问题)。我使用的代码如下:
import itertools
from itertools import permutations
#####################################################
def getWordsFromTiles(tiles,word):
#####################################################
return all(word.count(i) <= tiles.count(i) for i in word)
#####################################################
Main
#####################################################
chars = A?*
wilds = [
('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z')
if char == "?" or char == "*" else (char) for char in chars]
for p in itertools.product(*wilds):
x = ''.join(p)
hits.extend([word for word in data if getWordsFromTiles(x.upper(),word) and word not in hits])
A,A,A
A,B
A,C
.....
A,B,A
我实际上并不关心这些列表的顺序,所以当我已经生成了“A,A,B。任何想法如何实现它?
解决方法
实际上并不关心这些列表的顺序,所以当我已经生成“A,A,B”时,我希望没有A,B,A。
这是您要找的吗?
from itertools import combinations_with_replacement
s = ['A','B','C','D']
list(combinations_with_replacement(s,3))
[('A','A','A'),('A','B'),'C'),'D'),'D',('B',('C',('D','D')]