检查列表中的字符串是否多次出现
Check string in list for multiple occurrence
我正在尝试确定以下扑克牌是否为同花:
第一种情况我分析了5张牌。如果所有 5 套花色都相同 (C H D S),即同花为真,即只有一种花色存在。效果不错。
a=['AC', '3H', 'TD', '9C', 'KD']
flush = len({suit for _, suit in a}) ==1 #false
然而实际上通常有7张牌。 2 个由玩家持有,5 个在 table 上。在这里它变得有点复杂。我如何检查任何花色是否恰好出现了 5 次?
b=['AC', '3H', 'TD', '9C', 'KD', '7H', '5S']
flush = ?
速度非常重要,因为这是 montecarlo 模拟的内部循环的一部分,因此如果可能的话,这应该是单线的。
list = ['AC', '3H', 'TD', '9C', 'KD']
substring='C'
print( len([s for s in list if substring in s]))
您可以使用 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)]
如果速度是关键,那么,只有 7 张牌,4 套花色。这样就有 16384 种组合。我会将每个组合转换为一个数字,并使用该数字作为索引在预先计算的 table 中进行查找。
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
编辑:if-elif-elif
而不是 CONV 会更快。虽然不是一个漂亮或有趣的代码。
我正在尝试确定以下扑克牌是否为同花:
第一种情况我分析了5张牌。如果所有 5 套花色都相同 (C H D S),即同花为真,即只有一种花色存在。效果不错。
a=['AC', '3H', 'TD', '9C', 'KD']
flush = len({suit for _, suit in a}) ==1 #false
然而实际上通常有7张牌。 2 个由玩家持有,5 个在 table 上。在这里它变得有点复杂。我如何检查任何花色是否恰好出现了 5 次?
b=['AC', '3H', 'TD', '9C', 'KD', '7H', '5S']
flush = ?
速度非常重要,因为这是 montecarlo 模拟的内部循环的一部分,因此如果可能的话,这应该是单线的。
list = ['AC', '3H', 'TD', '9C', 'KD']
substring='C'
print( len([s for s in list if substring in s]))
您可以使用 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)]
如果速度是关键,那么,只有 7 张牌,4 套花色。这样就有 16384 种组合。我会将每个组合转换为一个数字,并使用该数字作为索引在预先计算的 table 中进行查找。
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
编辑:if-elif-elif
而不是 CONV 会更快。虽然不是一个漂亮或有趣的代码。