是否可以通过一行嵌套理解列表生成一副牌?
我正在考虑以下几行,虽然以下代码不起作用,那是因为我做得不对。
def cards():
signs = ["spade","hearts","club","diamond"]
cards = [[j for j in range(1,11)] for i in signs]
print cards
cards()
答案 0 :(得分:3)
你非常接近。您正在迭代标志,但您没有将它们包含在列表中。只需制作tuple
,如果您愿意代表该卡。
>>> signs = ["spade","hearts","club","diamond"]
>>> [[(j,i) for j in range(1,11)] for i in signs]
[[(1, 'spade'), (2, 'spade'), (3, 'spade'), (4, 'spade'), (5, 'spade'), (6, 'spade'), (7, 'spade'), (8, 'spade'), (9, 'spade'), (10, 'spade')],
[(1, 'hearts'), (2, 'hearts'), (3, 'hearts'), (4, 'hearts'), (5, 'hearts'), (6, 'hearts'), (7, 'hearts'), (8, 'hearts'), (9, 'hearts'), (10, 'hearts')],
[(1, 'club'), (2, 'club'), (3, 'club'), (4, 'club'), (5, 'club'), (6, 'club'), (7, 'club'), (8, 'club'), (9, 'club'), (10, 'club')],
[(1, 'diamond'), (2, 'diamond'), (3, 'diamond'), (4, 'diamond'), (5, 'diamond'), (6, 'diamond'), (7, 'diamond'), (8, 'diamond'), (9, 'diamond'), (10, 'diamond')]]
替代解决方案
>>> from itertools import product
>>> list(product(signs, range(1,11))
[('spade', 1), ('spade', 2), ('spade', 3), ('spade', 4), ('spade', 5), ('spade', 6), ('spade', 7), ('spade', 8), ('spade', 9), ('spade', 10),
('hearts', 1), ('hearts', 2), ('hearts', 3), ('hearts', 4), ('hearts', 5), ('hearts', 6), ('hearts', 7), ('hearts', 8), ('hearts', 9), ('hearts', 10),
('club', 1), ('club', 2), ('club', 3), ('club', 4), ('club', 5), ('club', 6), ('club', 7), ('club', 8), ('club', 9), ('club', 10),
('diamond', 1), ('diamond', 2), ('diamond', 3), ('diamond', 4), ('diamond', 5), ('diamond', 6), ('diamond', 7), ('diamond', 8), ('diamond', 9), ('diamond', 10)]
答案 1 :(得分:2)
def cards():
signs = ["spade","hearts","club","diamond"]
num= range(2,11)
num.extend(['A','K','Q','J'])
deck = [(i,j) for j in num for i in signs]
return deck
有一件事请为列表和方法名称使用不同的名称。两者都使用相同名称并不是很好的做法。我稍微扩展了一点A,K,Q,J
答案 2 :(得分:0)
你可以使用dicts;
def cards():
signs = ["spade","hearts","club","diamond"]
cards = [[{i,j} for j in range(1,11)] for i in signs]
答案 3 :(得分:0)
hearts = [A, 2, 3, 4, 5, 6, 7, 8, 9, 10, J, Q, K]
spades = [A, 2, 3, 4, 5, 6, 7, 8, 9, 10, J, Q, K]
diamonds = [A, 2, 3, 4, 5, 6, 7, 8, 9, 10, J, Q, K]
clubs = [A, 2, 3, 4, 5, 6, 7, 8, 9, 10, J, Q, K]
suits = [hearts, spades, diamonds, clubs]
suit = random.choice(suits)
card = random.choice(suit)
suit = str(suit)
print "The", card, "of", suit"
答案 4 :(得分:0)
import random
def make_deck():
suit = ['spades', 'hearts', 'diamonds', 'clubs']
val = ['ace', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'jack', 'queen', 'king']
deck = []
for s in suit:
for v in val:
deck.append(v + ' of ' + s)
return deck
deck = make_deck()
print make_deck()
print "there are", len(deck), "cards in this deck"
d = random.choice(deck)
c = random.choice(deck)
print "\ndraw two cards..\n\t", d, "and", "\n\t", c
答案 5 :(得分:0)
以下是1行解决方案:
cards = [(rank,suit) for suit in 'spades diamonds clubs hearts'.split() for rank in [str(n) for n in range(2, 11)] + list('JQKA')]
改编自Luciano Ramalho的Fluent Python,第1章的第一个例子
答案 6 :(得分:-1)
# new deck
deck = []
ranks = ["ace", "2", "3", "4", "5", "6", "7",
"8", "9", "10", "jack", "queen", "king"]
suits = ["spades", "hearts", "clubs", "diamonds"]
for suit in suits:
for rank in ranks:
card = (rank, suit)
deck.append(card)
# deck is complete