检查列表中的字符串是否多次出现

时间:2015-10-07 19:28:44

标签: 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', '5S']
flush = ?

速度非常重要,因为这是montecarlo模拟的内循环的一部分,所以如果可能的话,这可能应该是单行的。

2 个答案:

答案 0 :(得分:1)

您可以使用countmax来查找......嗯,任何套装的最大数量,看看它是否至少为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]))