将两个列表的笛卡尔积作为列表获取

问题描述

我是Python的初学者。

我一直在努力为自己的纸牌创建正确的列表理解。我想在一个列表中创建四个列表,其中每个“数字索引”都有合适的类型。我将尝试在下面显示

这就是我想要的:

deck = [["1 Hearts,"2H",..."13H"],["1 Diamonds","2D",..."13D"],[....],[...]]

这就是我所拥有的:

value = ["1","2","3","4","5","6","7","8","9","10","11","12","13"]
deck_types = ["hearts","diamonds","clubs","spades"]
deck = [[i] + value for i in deck_types]

输出

我无法发布图片,因为我的声誉低于10,但是我会对其进行描述。

[["hearts","1","3"....],["Diamonds",["Clubs","1"...],[....]]

如您所见,这并不是我想要的。每种类型在每个子列表中均成为nr [0]。我的计划是将.pop()函数与random.randint结合在一起进行抽奖。这样,当第一个玩家抓一张牌时,该牌将从卡组中删除。然后,第二个玩家将无法抽出同一张纸牌。然后,当我打印第一张玩家卡片时,我希望能够同时看到类型和号码。到目前为止,我只能看到该号码。

赞:

card1 = deck[random.randint(1,3)].pop(random.randint(2,13))
card2 = deck[random.randint(1,13))

解决方法

因此,我认为您不能一次完成列表理解,因为它需要2个循环。这是解构后的版本。

values = ["1","2","3","4","5","6","7","8","9","10","11","12","13"]
deck = []
card_suits = ["hearts","diamonds","clubs","spades"]
for suit in card_suits:
    suit_deck = []
    for number in values:
        card = f"{number} {suit}"
        suit_deck.append(card)
    deck.append(suit_deck)
    
print(deck)
[['1 hearts','2 hearts','3 hearts','4 hearts','5 hearts','6 hearts','7 hearts','8 hearts','9 hearts','10 hearts','11 hearts','12 hearts','13 hearts'],['1 diamonds','2 diamonds','3 diamonds','4 diamonds','5 diamonds','6 diamonds','7 diamonds','8 diamonds','9 diamonds','10 diamonds','11 diamonds','12 diamonds','13 diamonds'],['1 clubs','2 clubs','3 clubs','4 clubs','5 clubs','6 clubs','7 clubs','8 clubs','9 clubs','10 clubs','11 clubs','12 clubs','13 clubs'],['1 spades','2 spades','3 spades','4 spades','5 spades','6 spades','7 spades','8 spades','9 spades','10 spades','11 spades','12 spades','13 spades']]

或者对每个suit_deck使用列表理解

values = ["1","spades"]
for suit in card_suits:
    suit_deck = [f"{number} {suit}" for number in values]
    deck.append(suit_deck)
    
print(deck)
    
,

好吧,您只需要再一级列表即可。

deck = [[x+y for x in value] for y in deck_types]
,
values = ["1","13"]
card_suits = ["hearts","spades"]
[[f"{number} {suit}" for number in values] for suit in card_suits]

[['1 hearts','13 spades']]