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

时间:2015-10-20 18:30:42

标签: python arrays operators

我正在编写一个函数,可以返回一手牌是否有皇家同花顺。我尝试了各种不同的方法,但似乎都没有用;有些方法总是返回false,有些返回总是为true。

以下是始终返回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)

如果没有Jack of Clubs卡,则返回True。我假设and运算符会使它如此函数只返回True,如果所有卡都在数组中。我对这些事情比较陌生,所以会很感激初学者的解释

(编辑) 我已被标记为重复,但我之前已经看过引用的问题,但没有得到我想要的答案,这就是为什么我在特定情况下发布了这个问题。

2 个答案:

答案 0 :(得分:2)

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

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

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

或者如评论中所建议的那样:

return set(royalFlush).issubset(davesCards)

答案 1 :(得分:0)

你可以通过分离排名和适合

来缩短这个时间
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