Robię modified blackjack game. Bawiąc się tylko z kartami 2 do 9. Brak dziesiątek, kart do twarzy ani asy w tym pokładzie.

Aby rozpocząć, stworzyłem talii zmiennej, która bierze pustą listę.
Następnie stworzyłem 4 for loops, aby dołączyć listę kart do pokładu.

Chciałbym wiedzieć, czy jest krótszy sposób, aby napisać następujące miejsce:

import random

deck = []
for list_of_cards in range(2, 10):
    spades = 'spades'
    list_of_spades = str(list_of_cards) + ' of' + ' ' + spades
    deck.append(list_of_spades)
for list_of_cards in range(2, 10):
    clubs = 'clubs'
    list_of_clubs = str(list_of_cards) + ' of' + ' ' + clubs
    deck.append(list_of_clubs)
for list_of_cards in range(2, 10):
    diamonds = 'diamonds'
    list_of_diamonds = str(list_of_cards) + ' of' + ' ' + diamonds
    deck.append(list_of_diamonds)
for list_of_cards in range(2, 10):
    hearts = 'hearts'
    list_of_hearts = str(list_of_cards) + ' of' + ' ' + hearts
    deck.append(list_of_hearts)

A wynik jest taki jak chcę, co jest:

['2 of spades', '3 of spades', '4 of spades', '5 of spades', '6 of spades', '7 of spades', '8 of spades', '9 of spades', '2 of clubs', '3 of clubs', '4 of clubs', '5 of clubs', '6 of clubs', '7 of clubs', '8 of clubs', '9 of clubs', '2 of diamonds', '3 of diamonds', '4 of diamonds', '5 of diamonds', '6 of diamonds', '7 of diamonds', '8 of diamonds', '9 of diamonds', '2 of hearts', '3 of hearts', '4 of hearts', '5 of hearts', '6 of hearts', '7 of hearts', '8 of hearts', '9 of hearts']

Odkąd jestem nowy w Pythonie, zakładam, że istnieje sposób na napisanie tego krótszego. Dzięki za pomoc!

1
CRABOLO 5 grudzień 2013, 17:56

5 odpowiedzi

Najlepsza odpowiedź

Wystarczy dwa dla pętli:

deck = []
for suit in ('spades', 'hearts', 'diamonds', 'clubs'):
    for n in range(2, 10):
        deck.append('%i of %s' % (n, suit))

Możesz także napisać go za pomocą rozumienia listy:

deck = ['%i of %s' % (n, suit) for suit in ('spades', 'hearts', 'diamonds', 'clubs') for n in range(2, 10)]
1
Simeon Visser 5 grudzień 2013, 15:09

Dlaczego potrzebujesz 4 pętli? I dlaczego musisz stworzyć te bezużyteczne struny? (+ ' of' + ' ' + spades jest taka sama jak ' of spades' ...) (naprawiłem też inne rzeczy)

deck = []
for n in range(2, 10):
    deck.append('%i of spades' % n)
    deck.append('%i of hearts' % n)
    deck.append('%i of diamonds' % n)
    deck.append('%i of clubs' % n)

Lub użyj zagnieżdżonej pętli:

deck = []
for n in range(2, 10):
    for s in ['spades', 'hearts', 'diamonds', 'clubs']:
        deck.append('%i of %s' % (n, s))
5
tckmn 5 grudzień 2013, 14:04

Nie musisz używać oddzielnych ciągów dla "i", na przykład. Nie potrzebujesz oddzielnego ciągu, aby utrzymać słowo "Diamonds". Po prostu pisz "diamentów".

To powiedział: Oto rozwiązanie przy użyciu formatowania łańcucha, rozumienia listy i podział zamiast ręcznie tworzyć gabinet garniturów.

deck = ['%d of %s' % (face, suit) for suit in 'spades hearts clubs diamonds'.split() for face in range(2,10)]
4
leewz 5 grudzień 2013, 14:02

Użyłbym rozumienia listy:

>>> suits = ["hearts","diamonds","clubs","spades"]
>>> deck = ["{} of {}".format(num, suit) for suit in suits for num in range(2,10)]
>>> len(deck)
32
>>> deck
['2 of hearts', '3 of hearts', '4 of hearts', '5 of hearts', '6 of hearts', '7 of hearts', '8 of hearts', '9 of hearts', '2 of diamonds', '3 of diamonds', '4 of diamonds', '5 of diamonds', '6 of diamonds', '7 of diamonds', '8 of diamonds', '9 of diamonds', '2 of clubs', '3 of clubs', '4 of clubs', '5 of clubs', '6 of clubs', '7 of clubs', '8 of clubs', '9 of clubs', '2 of spades', '3 of spades', '4 of spades', '5 of spades', '6 of spades', '7 of spades', '8 of spades', '9 of spades']

Lista Comp tutaj jest równoważna

deck = []
for suit in suits:
    for num in range(2, 10):
        deck.append("{} of {}".format(num, suit))
2
DSM 5 grudzień 2013, 14:02
deck = []
colors = ["spades", "clubs", "diamonds", "hearts"]
for color in colors:
    for list_of_cards in range(2, 10):
        deck.append("{0} of {1}".format(list_of_cards, color))
1
RickyA 5 grudzień 2013, 14:02