使用 itertools 产品但需要组合行为

问题描述

我试图从输入中生成可能的字符串列表,考虑通配符“?”和 ”*”。列表项的排序应该无关紧要,这意味着如果列表中已经存在 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')]

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...