Python 检查所有元组是否都包含特定值

Python 检查所有元组是否都包含特定值,python,tuples,Python,Tuples,我有一个表示扑克牌的元组列表:hand=[('a','♣'), (‘A’,’♠'), (‘A’,’♦'), (‘A’,’♥'), (‘K’,’♠')]我想检查我是否有同花顺 我想用all(h[1]='♠' 对于手上的h),它似乎工作得很好(False,在这种情况下,但在其他情况下,它应该工作。当然,我需要检查所有4套西装的这一点……,但我想知道这是否是正确/最好的方法您可以: any(all(h[1] == suit for h in hand) for suit in ('♣','♠','♦'

我有一个表示扑克牌的元组列表:
hand=[('a','♣'), (‘A’,’♠'), (‘A’,’♦'), (‘A’,’♥'), (‘K’,’♠')]我想检查我是否有同花顺

我想用
all(h[1]='♠' 对于手上的h)
,它似乎工作得很好(
False
,在这种情况下,但在其他情况下,它应该工作。当然,我需要检查所有4套西装的这一点……,但我想知道这是否是正确/最好的方法

您可以:

any(all(h[1] == suit for h in hand) for suit in ('♣','♠','♦','♥'))

这不是很有效,但在我看来很容易理解,或者你可以按照@Ev.Kounis在评论中的建议去做,这是一个更有效的解决方案,但不太容易理解。因为这个游戏每副牌只有52张牌,4套西装,13套牌,每手5张牌,所以数字不会太大,它们需要任何特殊的处理来提高效率cy,所以我会使用这个解决方案。

为了补充Ofer-Sadans的答案,我建议使用标志来表示卡片,因为整数比通过计算机更容易计算值

这个解决方案需要某种从元组类型到整数表示的转换,但可以使用简单的lambda函数

card = ('K','\u2660') # for example. K ♠
card_pack = lambda c: (ord(c[0])<<16)+ord(c[1])  #c for card 
# where you have now 32 bit integer that contains all your values  
# 00000000-01001011|00100110-01100000 == 4 925 024 
#        KING      |      SPADE 
然后,如果需要,您可以使用
解包
功能解包每张卡:

card_unpack = lambda ci: ( (ci>>16)&0xffff, ci&0xffff) #ci for card integer 
unpack_2_individual_cards = lambda hand_i,_i: (hand_i>>(32*_i))&0xffffffff

# then you just need to do similar function as summing for hand_i but inverse to get each card individual and use unichr/chr to represent values after that.   
hand = [ unpack_2_individual_cards(hand_i, i ) for i in range(5) ]   
然后,手的力量测试或手的类型测试将很容易:

STRAIGHT = 1675898824200706064573121072408259537242498659 
if hand_i&STRAIGHT==STRAIGHT: print('you have straight') 
if hand_i < STRAIGHT: print('straight wins!!')
stright=1675898824200706064573121072408259537242498659
如果hand_i&STRAIGHT==STRAIGHT:print('youhaveStraight')
如果手写体<笔直:打印('笔直赢!!'))

请记住任何逻辑操作(使用
all
any
)在寻找元素之间的逻辑关系时使用相同的方法。只是这种方法太低级了,所以它是在表面之下。我们比较的数据类型对我们作为程序员来说是一样的,但对计算机来说,只要我们告诉它在哪里可以找到它,它是一样的


您可以使用
struct
模块来打包和解包数据,而不是那些
lambdas
,并且您可以使用
0x00ff00ff00ff00ff00ff
的简单掩码和
0xff00ff00ff00ff00ff00
的值来检查手头的卡的具体类型,因为所有卡都是按
值| deck
打包的ck不检查直接冲洗,而是检查flushI是否进行
len(设置(h[1]表示h在手))==1以覆盖所有suits@Ev.Kounis我正要将此选项编辑到我的问题中…我也认为这是一个更好的选项如果你可以拥有一手
10000000张
卡,那么有更好的方法来检查刷新(短路)但对于5张牌来说,这并不重要。您可以检查剩余的牌套
手牌[1:][1]
与第一张牌套
手牌[0][1]
的值,因此您不必担心不同的牌套。
STRAIGHT = 1675898824200706064573121072408259537242498659 
if hand_i&STRAIGHT==STRAIGHT: print('you have straight') 
if hand_i < STRAIGHT: print('straight wins!!')