#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. это также исправило это, но я могу дать только одну зеленую галочку, а другая была короче 😅