在python中嵌套的理解来生成一副牌

时间:2014-06-25 11:34:52

标签: python list-comprehension

是否可以通过一行嵌套理解列表生成一副牌?

我正在考虑以下几行,虽然以下代码不起作用,那是因为我做得不对。

def cards():
    signs = ["spade","hearts","club","diamond"]
    cards = [[j for j in range(1,11)] for i in signs]   
    print cards
cards()

7 个答案:

答案 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