按attibute排序对象列表不排序?

2024-09-25 00:24:20 发布

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

我想用python编写一个hold'em扑克模拟器来学习这门语言(python3.7)。我首先创建了一个Card类,其中包含value(例如5或K)和suit(例如hearts或spades)。一副牌是通过将每一个值与每一套衣服相匹配而产生的:

suits = ["Hearts","Diamonds","Spades","Clubs"]
values = ["2","3","4","5","6","7","8","9","10","11","12","13","14"] 
#note that i replaced the values J by 10, Q by 11...to later easier compare them
class Card(object):   
    value = 0
    suit = ""

    def __init__(self, value, suit):
        self.value = value
        self.suit = suit

def create_card(value, suit):  
    card = Card(value, suit)
    return card

deck = []
for i in values: 
    for j in suits:
        deck.append(create_card(i,j))

random.shuffle(deck)

所以现在我有一个洗牌列表的卡对象,并采取两张牌,并分配给一个球员。然后我再抽5张牌,普通牌:

player1 = []
for i in range(2):
   player1.append(deck.pop(0))

commoncards = []
for i in range(5):
   commoncards.append(deck.pop(0))

现在我有两张卡片对象列表,一张是我的玩家的全卡,一张是普通卡。到现在为止,一直都还不错。现在我想确定玩家的手牌(例如一对、两对或三对等),我想一个很好的方法是加入玩家列表和commoncards列表的副本,并按值排序,以检查两个“邻居”元素是否具有相同的值:

commoncardscopy=commoncards.copy()   
player1.extend(commoncardscopy)

player1.sort(key=lambda Card : Card.value)

for i in range(len(player1)):
    print(player1[i].value)

这应该打印7个排序的卡片值(例如2,2,4,5,8,8,12),对吗?好吧,它不是。这里有一个输出示例:10 13 13 14 7 7 9个

有人知道为什么吗?感谢您的帮助或反馈:)


Tags: inself列表forvalue玩家rangecard
2条回答

对卡片值使用整数可能是个好主意,因为如果使用字符串,卡片将按字母顺序排序。如果您想保留卡片值字符串,您可能需要使用^{}函数来进行转换。您有两种选择:

  • 用整数列表替换values
  • 替换lambda中的代码并使用key = lambda x: int(x.value)

尝试使用:

...
print(sorted([int(i.value) for i in player1]))

相关问题 更多 >