我试图找出以下扑克牌是否是同花顺:
在第一种情况下,我分析了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', '5S']
flush = ?
速度非常重要,因为这是montecarlo模拟的内循环的一部分,所以如果可能的话,这可能应该是单行的。
答案 0 :(得分:1)
您可以使用count
和max
来查找......嗯,任何套装的最大数量,看看它是否至少为5。
>>> 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,但仍然如此。或者使用collections.Counter
。这应该快得多(O(n)),因为它使用字典来跟踪计数。
>>> max(collections.Counter((s for _, s in b)).values())
2
>>> collections.Counter((s for _, s in b)).most_common(1)
[('H', 2)]
答案 1 :(得分:0)
list = ['AC', '3H', 'TD', '9C', 'KD']
substring='C'
print( len([s for s in list if substring in s]))