在一副牌中将值1替换为Ace

2024-05-13 22:04:53 发布

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

我们被指派制作一个洗牌程序。我还是一个编程新手,所以这对我来说不是一个最容易的任务。我们得到了对itertools进行研究的提示,所以我就是这么做的。到目前为止,我的计划如下:

import itertools
import random

deck = list(itertools.product(range(1,14),['Heart','Spade','Club','Diamond']))

random.shuffle(deck)

print("Order of deck:")
for i in range(52):
    print(deck[i][0], "of", deck[i][1])

如果运行此选项,您将获得:

Order of deck:
9 of Heart
10 of Diamond
2 of Spade
1 of Heart
11 of Spade
4 of Diamond
10 of Heart
...

你得到一副洗过的牌,就像我想要的

剩下要做的唯一一件事是将1的值更改为“Ace”,将11的值更改为“Jack”

但我不知道怎么做,因为我的列表“卡片组”由52项组成,每一张卡片都是一个元组。比如说

deck[0] = (1, 'Spade')

到目前为止,我唯一学会替换的是

deck.replace(1,"Ace")

for n, i in enumerate(deck):
    if i == 1:
        deck[n] = "Ace"

但这两个都不起作用。 第一个不起作用,因为我的组不是字符串,而是列表。 如果我运行第二个,没有任何变化,输出仍然与没有那段代码时完全相同

总之,我想在我的小程序中将1改为“Ace”,然后我可以将11改为“Jack”。。。 (抱歉英语不好,希望一切都清楚)


Tags: ofinimport程序fororderrangerandom
3条回答

有两种方法可以实现这一点,这取决于你正在尝试做什么。如果您想要捕获Jack的值是11的概念,那么您只需要更改显示的值(即,在打印之前进行检查,并将11替换为Jack,等等)。但是,如果该值不是特别需要考虑的,则可以在创建时摆弄该组:

deck = list(itertools.product(["A", *range(2,11), 'J', 'Q', 'K'],['Heart','Spade','Club','Diamond']))

你不需要更换任何东西。可以使用函数返回适当的字符串值

def get_face(x):
    if x == 1:
        return 'Ace' 
    elif x == 11:
        return 'Jack' 
    else:  # TODO: add others 
        return x

for card in deck:
    print(get_face(card[0]), "of", card[1])

使用要显示的字符串创建列表:

values = ['Ace'] + [str(i) for i in range(2,11)] + ['Jack', 'Queen', 'King']
suits = ['Heart', 'Spade', 'Club', 'Diamond']
deck = list(itertools.product(values, suits))

相关问题 更多 >