我的字典有什么问题(映射值到卡片)

问题描述:

所以游戏是二十一点,我有代码片段来制作一副牌和一只手。从甲板上,这是一个列表,我试图建立一个字典,以便每张牌(甲板上的一个元组)都将有一个映射到它的值,按照Blackjack的规则。我的字典有什么问题(映射值到卡片)

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()函数有时会导致一个错误,其中“弹出指数超出范围“,所以建议您尝试以使其始终能够正常工作,这也值得赞赏。

+0

也许使'''行列'''(等级,值)元组的项目。然后你可以使用['''operator.itemgetter'''](https://docs.python.org/3/library/operator.html#operator.itemgetter)来检索出值排序。 – wwii

将行:

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

有:

rank = card[1] 

是的,你可以更高效地(优雅),通过创建映射值,以分数的字典做到这一点:

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

然后你不需要if/elif ... else:

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

在列表理解中,程序实现了查看卡片的卡组。如果我删除列表理解,不会再定义卡吗? –

+0

@ChartererSling我不确定我是否理解你在说什么,你是否尝试了我的第一个建议?它应该需要2秒的时间来尝试! – alfasin

+0

我尝试了更有效的方式建议,它像宝石一样工作,谢谢!我只是想知道当你说要用'rank = card [1]'替换时,我收到一个错误,其中卡未定义。 –