Python: 如何查找列表中特定数量的项目是否相同?
Python: How to find whether a specific number of items in a list are identical?
我正在尝试创建一个扑克游戏,并且我有一个值列表,可以是列表中从 A 到 K 的任何值(名为 "number")。为了确定玩家是否有 "Four of a Kind",程序需要检查值列表中的四个项目是否相同。
我不知道该怎么做。您会以某种方式使用 number[0] == any in number
函数四次,还是完全不同?
假设您的 number 变量是一个包含 5 个元素(五张牌)的列表,您可以尝试类似的方法:
from collections import Counter
numbers = [1,4,5,5,6]
c = Counter(numbers)
这利用了 awesome Counter class。 :)
获得计数器后,您可以通过以下操作检查最常见的次数:
# 0 is to get the most common, 1 is to get the number
max_occurrencies = c.most_common()[0][1]
# this will result in max_occurrencies=2 (two fives)
如果你还想知道哪一张是经常出现的卡片,你可以使用元组解包一次获得这两个信息:
card, max_occurrencies = c.most_common()[0]
# this will result in card=5, max_occurrencies=2 (two fives)
您还将这些计数存储在 collections.defaultdict
中,并检查最大出现次数是否等于您的特定项目数:
from collections import defaultdict
def check_cards(hand, count):
d = defaultdict(int)
for card in hand:
rank = card[0]
d[rank] += 1
return max(d.values()) == count:
工作原理如下:
>>> check_cards(['AS', 'AC', 'AD', 'AH', 'QS'], 4) # 4 Aces
True
>>> check_cards(['AS', 'AC', 'AD', '2H', 'QS'], 4) # Only 3 Aces
False
更好的是 collections.Counter()
, as shown in 答案:
from collections import Counter
from operator import itemgetter
def check_cards(hand, count):
return max(Counter(map(itemgetter(0), hand)).values()) == count
我正在尝试创建一个扑克游戏,并且我有一个值列表,可以是列表中从 A 到 K 的任何值(名为 "number")。为了确定玩家是否有 "Four of a Kind",程序需要检查值列表中的四个项目是否相同。
我不知道该怎么做。您会以某种方式使用 number[0] == any in number
函数四次,还是完全不同?
假设您的 number 变量是一个包含 5 个元素(五张牌)的列表,您可以尝试类似的方法:
from collections import Counter
numbers = [1,4,5,5,6]
c = Counter(numbers)
这利用了 awesome Counter class。 :)
获得计数器后,您可以通过以下操作检查最常见的次数:
# 0 is to get the most common, 1 is to get the number
max_occurrencies = c.most_common()[0][1]
# this will result in max_occurrencies=2 (two fives)
如果你还想知道哪一张是经常出现的卡片,你可以使用元组解包一次获得这两个信息:
card, max_occurrencies = c.most_common()[0]
# this will result in card=5, max_occurrencies=2 (two fives)
您还将这些计数存储在 collections.defaultdict
中,并检查最大出现次数是否等于您的特定项目数:
from collections import defaultdict
def check_cards(hand, count):
d = defaultdict(int)
for card in hand:
rank = card[0]
d[rank] += 1
return max(d.values()) == count:
工作原理如下:
>>> check_cards(['AS', 'AC', 'AD', 'AH', 'QS'], 4) # 4 Aces
True
>>> check_cards(['AS', 'AC', 'AD', '2H', 'QS'], 4) # Only 3 Aces
False
更好的是 collections.Counter()
, as shown in
from collections import Counter
from operator import itemgetter
def check_cards(hand, count):
return max(Counter(map(itemgetter(0), hand)).values()) == count