如何制作一副带有多个变量的纸牌?

How to make a deck of cards with several variables?

所以,我要制作一副异常的纸牌。每张卡片都有颜色(红色、绿色、蓝色)、度数(1、​​2、3)、符号(三角形、正方形、圆形)和数字。(1、2、3)我有一个 class 看起来像这样。

class card:
def __init__(self, color, degree, symbol, number):
    self.color=color
    self.degree=degree
    self.symbol=symbol
    self.number=number
def __repr__(self):
    return "(%s,%s,%s,%s)" %(self.color,self.degree,self.symbol,self.number)

我还有这些列表,其中包含所有变量和我想要的一副纸牌。

colors=["red", "green", "blue"]
degrees=["1","2","3"]
symbols=["triangle", "square", "circle"]
numbers=["1","2","3"]
deck=[]

现在,我想做的是用每张可能的卡片创建一副完整的牌组。最好它们是随机排列的,但这不是必需的。 我知道如果它只是一个数字和颜色我可以很容易地这样做。

deck = [card(value, color) for value in range(0, 2) for color in colors]

但是,当我还要使用符号和度数时,我无法弄清楚如何制作它。我试图建立更多的 if 语句来循环它,但这没有用。我也不希望同一张卡片出现两次,我也不想要一张不遵循 class 规则的卡片,它们必须被构造为 [color,degree,symbol,number]

有人知道该去哪里吗?

包含所有可能的卡片组合的整副牌:

deck = [card(color, degree, symbol, number) for color in colors \
        for degree in degrees for symbol in symbols for number in numbers]

为了随机化牌组中的卡片顺序,请看这个:Shuffling a list of objects

你想要颜色、度数、符号和数字的所有组合吗?

如果是这样,请使用嵌套 for 循环:

deck = []
for color in colors:
    for degree in degrees:
        for symbol in symbols:
            for number in numbers:
                deck.append(card(color, degree, symbol, number)

# Also written as a list comprehension
deck = [
    card(color, degree, symbol, number)
    for color in colors
        for degree in degrees
            for symbol in symbols
                for number in numbers
]  # The indent is just to show how it works. For style, put them all at the same indent.

或者使用itertools.product(也可以偷懒)

deck = itertools.starmap(card, itertools.product(colors, degrees, symbols, numbers))

deck = list(deck)  # If you really need it to be a list

使用 itertools

中的 product
import itertools


deck = [
    card(color, degree, symbol, number)
    for color, degree, symbol, number in
    itertools.product(colors, degrees, symbols, numbers)
]
import itertools

identifiers = [colors, degrees, symbols, numbers]
deck = [[*i] for i in itertools.product(*identifiers)]
[['red', '1', 'triangle', '1'], ['red', '1', 'triangle', '2'], ['red', '1', 'triangle', '3'],...