我的字典怎么了(把值映射到卡片上)

2024-04-25 05:15:13 发布

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

所以游戏是21点,我有一些代码片段来制作一副牌和一手牌。根据21点规则,从牌堆中,这是一个列表,我试图建立一个字典,以便每一张牌(牌堆中的元组)都有一个映射到它的值。在

from random import randint

def make_deck():
    deck = []
    for suit in suits:
        for rank in ranks:
            deck.append((suit,rank))
    return deck

suits = ['spades','hearts','diamonds','clubs']
ranks = ['ace','two','three','four','five','six','seven','eight','nine','ten','jack','queen','king']

deck = make_deck()

def make_hand():
    hand = []
    for k in range(2):
        card = deck.pop(randint(0,51))
        hand.append(card)
    return hand

hand = make_hand()

values = {} #empty dictionary
for card in deck:
    rank = [card[1] for card in deck]
    if rank == 'ace':
        values[card] = 1
    elif rank == 'two':
        values[card] = 2
    elif rank == 'three':
        values[card] = 3
    elif rank == 'four':
        values[card] = 4
    elif rank == 'five':
        values[card] = 5
    elif rank == 'six':
        values[card] = 6
    elif rank == 'seven':
        values[card] = 7
    elif rank == 'eight':
        values[card] = 8
    elif rank == 'nine':
        values[card] = 9
    elif rank == 'ten' or 'jack' or 'queen' or 'king':
        values[card] = 10
 print values

显然,这在很大程度上是用蛮力来创建词典的,而且缺乏任何优雅之处,因此,如果有人能给我们提供更有效的方法,我们将不胜感激。真正的问题是我无法识别代码中的错误,print values只返回一个映射到其值的元组,而不是整个字典。如果我将rank的列表理解移到循环之外,我只会得到一个字典,其中所有内容都映射到值10。在

另外,我刚刚意识到,我的make_hand()函数有时会导致“pop索引超出范围”的错误,因此建议您尝试哪些方法使其始终有效也将非常感谢。在


Tags: or代码in列表formake字典card
1条回答
网友
1楼 · 发布于 2024-04-25 05:15:13

更换管路:

rank = [card[1] for card in deck]

有:

^{pr2}$

是的,通过创建一个将值映射到分数的字典,您可以更高效(优雅地)完成这项工作:

mapper = {'ace': 1, 'two': 2, ...}

然后你就不需要if/elif…否则:

for card in deck:
    values[card] = mapper[card[1]]

相关问题 更多 >