如何检查数组是否包含多个特定元素

2024-10-04 01:24:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在写一个函数,可以返回一手牌是否有皇家花红。我尝试过各种不同的方法,但似乎没有一个有效;有些方法返回的结果总是错误的,有些方法返回的结果总是真的。在

下面是一个始终返回true的方法

davesCards = ['10C','10S','QC','KC','AC','10S','4C'] #this should return false

def royalFlushCheck(playerCards):
    if '10S' and 'JS' and 'QS' and 'KS' and 'AS' in playerCards:
        return True
    if '10H' and 'JH' and 'QH' and 'KH' and 'AH' in playerCards:
        return True
    if '10C' and 'JC' and 'QC' and 'KC' and 'AC' in playerCards:
        return True
    if '10D' and 'JD' and 'QD' and 'KD' and 'AD' in playerCards:
        return True
    return False

royalFlushCheck(davesCards)

这将返回True,当它应该是false时,因为没有Jack of Clubs卡。我假设and运算符会使它生效,因此只有当所有的卡都在数组中时,函数才会返回True。我对这些东西比较陌生,所以希望贝吉纳能解释一下

(编辑) 我已经被标记为重复,但我已经看到了问题引用,并没有得到我想要的答案,这就是为什么我张贴了我的具体情况的问题。在


Tags: and方法函数infalsetruereturnif
2条回答

您的代码只检查列表中是否有“AS”、“AH”或“AC”、“AD”。 更优雅的方法是使用子集。在

if set(royalFlush).issubset(set(davesCards)):
    return True

其中royalFlush = ['AS','JS','QS','KS','10S']

或如评论所示:

^{pr2}$

你可以把军衔和官职分开来缩短

def royalFlushCheck(playerCards):
    suits = [card[-1] for card in playerCards]
    ranks = [card[:-1] for card in playerCards]
    allRanks = all([rank in ranks for rank in ['10', 'J', 'Q', 'K', 'A']])
    sameSuit = len(set(suits)) == 1
    return allRanks and sameSuit

相关问题 更多 >