String 检查列表中的字符串是否多次出现
我想知道下面这张牌是否是同花顺的: 在第一个案例中,我分析了5张卡片。如果所有5套西装都相同(C H D S),即只有一套西装,则同花顺为真。那很好String 检查列表中的字符串是否多次出现,string,list,python-3.x,poker,String,List,Python 3.x,Poker,我想知道下面这张牌是否是同花顺的: 在第一个案例中,我分析了5张卡片。如果所有5套西装都相同(C H D S),即只有一套西装,则同花顺为真。那很好 a=['AC', '3H', 'TD', '9C', 'KD'] flush = len({suit for _, suit in a}) ==1 #false 但实际上通常有7张牌。2个被球员拿着,5个在桌子上。这里变得有点复杂了。我如何检查是否有任何诉讼发生5次 b=['AC', '3H', 'TD', '9C', 'KD', '7H', '
a=['AC', '3H', 'TD', '9C', 'KD']
flush = len({suit for _, suit in a}) ==1 #false
但实际上通常有7张牌。2个被球员拿着,5个在桌子上。这里变得有点复杂了。我如何检查是否有任何诉讼发生5次
b=['AC', '3H', 'TD', '9C', 'KD', '7H', '5S']
flush = ?
速度非常重要,因为这是蒙特卡洛模拟的内部循环的一部分,所以如果可能的话,这应该是一条直线。您可以使用
count
和max
来查找。。。嗯,任何一套衣服的最大数量,看看是否至少有5套
list = ['AC', '3H', 'TD', '9C', 'KD']
substring='C'
print( len([s for s in list if substring in s]))
>>> b = ['AC', '3H', 'TD', '9C', 'KD', '7H', '5S']
>>> suits = [s for _, s in b]
>>> max(suits.count(s) for s in suits) >= 5
False
但这将循环该列表中每个元素的suits
,使其复杂性为O(n^2)。考虑到n
只有7,可能还不算太坏,但仍然是。或使用。这应该快得多(O(n)),因为它使用字典来跟踪计数
>>> max(collections.Counter((s for _, s in b)).values())
2
>>> collections.Counter((s for _, s in b)).most_common(1)
[('H', 2)]
如果速度是关键,那么,只有7张牌,4套西装。这就是16384个组合。我会将每个组合转换为一个数字,并使用这个数字作为索引在预计算的表中进行查找
CONV = dict(C=0, H=1, D=2, S=3)
def flush_table_index(cards):
n = 0
for _, s in cards:
n = n * 4 + CONV[s]
return n
编辑:
如果elif elif
而不是CONV会更快。但这不是一个漂亮或有趣的代码。上面的代码将为您提供列表中特定套装的计数。您不需要“正好5次”,您需要“5次或更多次”。但是对于速度来说,最重要的是停止使用字符串作为卡片。弦是给人类的;计算机使用数字。