Как сделать колоду карт с несколькими переменными? - PullRequest
0 голосов
/ 26 сентября 2018

ТАК, я собираюсь сделать ненормальную колоду карт.Каждая карта будет иметь цвет (красный, зеленый, синий), степень (1,2,3), символ (треугольник, квадрат, круг) и число. (1,2,3) У меня есть класс, который выглядиткак это.

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, чтобы все зациклить, но это не сработало.Я также не хочу, чтобы одна и та же карта появлялась дважды, и я не хочу, чтобы карта, которая не соответствует правилам класса, должна отображаться как [цвет, степень, символ, число]

У кого-нибудь есть идея, гдепойти с этим?

Ответы [ 4 ]

0 голосов
/ 26 сентября 2018
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'],...
0 голосов
/ 26 сентября 2018

Хотите ли вы все комбинации цветов, градусов, символов и чисел?

Если это так, используйте вложенные циклы:

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
0 голосов
/ 26 сентября 2018

использование product от itertools

import itertools


deck = [
    card(color, degree, symbol, number)
    for color, degree, symbol, number in
    itertools.product(colors, degrees, symbols, numbers)
]
0 голосов
/ 26 сентября 2018

Полная колода с каждой возможной комбинацией карт:

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

Чтобы рандомизировать порядок карт в колоде, взгляните на это: Перемешивание списка объектов

...