Замена значения 1 словом Туз в колоде карт

#python #python-3.x

#python #python-3.x

Вопрос:

Мы получили задание создать программу, которая перетасовывает колоду карт. Я все еще новичок в программировании, поэтому для меня это было не самым простым назначением. Мы получили совет провести некоторое исследование в 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 на «Туз», 11 на «Валет», …

Но я не могу понять, как это сделать, потому что мой список «колода» состоит из 52 элементов с каждой картой в виде кортежа. Например

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

Пока единственное, что я научился заменять, это

 deck.replace(1,"Ace")
 

и

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

Но оба они не работают.
Первый не работает, потому что моя колода — это не строка, а список.
И если я запускаю второй, ничего не меняется, результат остается точно таким же, как и без этого фрагмента кода.

Итак, чтобы подвести итог, я хочу изменить 1 на «Туз» в моей маленькой программе, а затем я мог бы сделать то же самое для 11 на «Валет», … (Извините за плохой английский, надеюсь, все понятно)

Ответ №1:

Есть два способа добиться этого, в зависимости от того, что вы пытаетесь сделать. Если вы хотите зафиксировать представление о том, что значение Валета равно 11, тогда вам нужно будет изменить только отображаемое значение (т. Е. Проверить перед печатью и заменить 11 на Jack , и т.д.). Однако, если значение не вызывает особого беспокойства, вы можете поиграть с колодой во время создания:

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

Комментарии:

1. Это дало значение IndexErrox (индекс списка вне диапазона) в строке print(deck [i] [0], «of», deck [i] [1]), но также вернуло вывод типа «диапазон (2,11) сердца

2. @ZinoWR: упс! извините, у меня там была опечатка (обратите * внимание ). Проверьте это сейчас 🙂

Ответ №2:

Создайте свой список со строками, которые вы хотели бы отобразить:

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

Ответ №3:

Вам не нужно ничего заменять. Вы можете использовать функцию для возврата соответствующего строкового значения

 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])
 

Комментарии:

1. это также исправило это, но я могу дать только одну зеленую галочку, а другая была короче 😅