检查列表是否包含4个相同值的元素

时间:2010-12-21 21:50:54

标签: python list-comparison

所以我再次陷入新手问题:D

我正在尝试将基于文本的游戏与计算机混合在一起。

好的,所以1张卡片实际上是两个列表中元素的元组。

suits = ['Clubs', 'Diamonds', 'Spade', 'Hearts']
ranks = [None, 'ace', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'jack', 'queen', 'king']

然后将其添加到牌组中并进行洗牌,然后将其交易到手中。 (从我认为的thinkpython这本书中得到了大部分内容。在这个过程中学到了很多关于类结构和继承的知识。)

所以一只手可能看起来像这样

['Clubs 2', 'Diamonds king', 'Diamonds 2', 'Spades 2', 'Hearts 2']

正如你所看到的那样,手牌包含四个相同的等级,因此对于玩家来说是1分。 但是,我如何检查手牌是否包含排名列表中任何项目的四个实例? 我是否必须遍历列表中的每个项目或者有一些简洁明了的方法?


修改
非常感谢所有答案的人。 :d 但是当我尝试在手中的项目上使用“拆分”时,我收到属性错误。 猜猜我应该发布更多我正在运行的代码。

这里有完整的代码和追溯 http://pastebin.com/TwHkrbED

Card中如何定义方法有什么问题? 我一直在努力工作几个小时,但没有运气。

EDIT2
对甲板生成部分进行了一些更改。现在整个套牌是一个元组列表和更少的代码。

thedeck=[]
class Deckofcards:
    suits = ['Clubs', 'Diamonds', 'Hearts', 'Spades']
    ranks = ['Ace', '2', '3', '4', '5', 
        '6', '7', '8', '9', '10', 'Jack', 'Queen', 'King']
    def __init__(self):
        for i in self.suits:
            for a in self.ranks:
                thedeck.append((i, a))
似乎另一种方式过于复杂,但是idk。我明天会看到它如何,加上实际的游戏部分。

5 个答案:

答案 0 :(得分:4)

我可能会建议进行轻微的重构:将每张卡片作为(rank, suit)的元组代表。所以你的榜样就是:

hand = [('2', 'Clubs'),
        ('king', 'Diamonds'),
        ('2', 'Diamonds'),
        ('2', 'Spades'),
        ('2', 'Hearts')]

然后我会建议一些辅助功能来帮助你确定一只手的价值:

from collections import defaultdict

def get_counts(hand):
    """Returns a dict mapping card ranks to counts in the given hand."""
    counts = defaultdict(int)
    for rank, suit in hand:
        counts[rank] += 1
    return counts

def get_points(hand):
    """Returns the number of points (ie, ranks with all 4 cards) in the given
    hand."""
    return sum(1 for count in get_counts(hand).itervalues() if count == 4)

修改:在sum函数中切换到使用get_points,这对我来说更清晰。

使用这些函数和你给出的示例手,你得到如下输出:

>>> get_counts(hand)
defaultdict(<type 'int'>, {'king': 1, '2': 4})

>>> get_points(hand)
1

答案 1 :(得分:1)

这是一种方式:

x = ['Clubs 2', 'Diamonds king', 'Diamonds 2', 'Spades 2', 'Hearts 2']
ranks = [i.split()[1] for i in x]
fourofakind = any(ranks.count(i)==4 for i in set(ranks))
如果手中有四张相同等级的牌,则

fourofakind为真。

答案 2 :(得分:0)

如果您正在寻找一种扩展功能:

hand = ['Clubs 2', 'Diamonds king', 'Diamonds 2', 'Spades 2', 'Hearts 2']
hand_ranks = [i.split()[1] for i in x]
fourofakind = {}
for i in set(hand_ranks):
    fourofakind[i] = (hand_ranks.count(i) == 4)

会给你一个dict()映射卡等级(手中的牌)你是否有4个等级。

答案 3 :(得分:0)

比贾斯汀更为一般:

suits = ['Clubs', 'Diamonds', 'Spade', 'Hearts']
ranks = [None, 'ace', '2', '3', '4', '5', '6', '7', \
'8', '9', '10', 'jack', 'queen', 'king']

hand = ['Clubs 2', 'Diamonds king', 'Diamonds 2', 'Spades 2', 'Hearts king']
rankshand = [i.split()[1] for i in hand]

fourofakind = [hr for hr in ranks if rankshand.count(hr)==4]
threeofakind = [hr for hr in ranks if rankshand.count(hr)==3]
pair = [hr for hr in ranks if rankshand.count(hr)==2]

fourofakind
[]
threeofakind
['2']
pair
['king']

能够查看哪个等级具有该设置。

答案 4 :(得分:0)

在Python 2.7中添加到标准库Counter模块的新内置collections类使这非常简单。

suits = ['Clubs', 'Diamonds', 'Spade', 'Hearts']
ranks = [None, 'ace', '2', '3', '4', '5', '6', '7',
         '8', '9', '10', 'jack', 'queen', 'king']
hand = ['Clubs 2', 'Diamonds king', 'Diamonds 2', 'Spades 2', 'Hearts 2']

from collections import Counter

counts = Counter(card.split()[1] for card in hand)
four_of_a_kind = [rank for rank,count in counts.iteritems() if count == 4]
print 'four_of_a_kind:', four_of_a_kind
# four_of_a_kind: ['2']