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

Python 获取两个列表的笛卡尔乘积作为列表列表,python,python-3.x,list,cartesian-product,Python,Python 3.x,List,Cartesian Product,我是Python的初学者 我一直在努力为我的一副牌创建一个合适的列表理解。我想在一个列表中创建四个列表,其中每个“编号索引”都有管件类型。我将试着在下面展示 这就是我想要的: deck = [["1 Hearts, "2H", ..."13H"], ["1 Diamonds", "2D", ..."13D"], [....], [...]] value = ["1"

我是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]
card1 = deck[random.randint(1, 3)].pop(random.randint(2, 13))
card2 = deck[random.randint(1, 3)].pop(random.randint(2, 13))
这就是我所拥有的:

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]
card1 = deck[random.randint(1, 3)].pop(random.randint(2, 13))
card2 = deck[random.randint(1, 3)].pop(random.randint(2, 13))
输出:

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]
card1 = deck[random.randint(1, 3)].pop(random.randint(2, 13))
card2 = deck[random.randint(1, 3)].pop(random.randint(2, 13))
我不能发布图片,因为我的声誉低于10,但我会描述它

[["hearts", "1", "2", "3"....], ["Diamonds", "1", "2", "3"....], ["Clubs", "1"...], [....]]
正如你所看到的,这并不是我想要的。每个类型成为每个子列表中的nr[0]。我的计划是将.pop()函数与random.randint结合起来用于抽卡。因此,当第一个玩家抽到一张牌时,该牌将从牌组中移除。那么第二个玩家将不能抽到同一张牌。当我打印第一张球员卡时,我希望能够同时看到类型和号码。到目前为止,我只能看到数字

像这样:

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]
card1 = deck[random.randint(1, 3)].pop(random.randint(2, 13))
card2 = deck[random.randint(1, 3)].pop(random.randint(2, 13))

所以,我不认为你能在一个单一的列表理解中做到这一点,因为它需要两个循环。这是解构的版本

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']]
或者对每一套西装都使用一份清单

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 = [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]

[f“{number}{suite}”表示卡牌套装中套装的数值]
为您获取一个包含所有卡牌的单组列表,但不会将其划分为两个列表。我认为你不能在列表理解中定义一个列表哦,天哪,我错了。检查我的另一个答案……如果你发现你错了,你可以选择你当前的答案,而不是留下来再加上一个。也许,但这会抹去历史,也许思考过程会让其他人受益。@PranavHosangadi,他需要一份列表。@najeem这绝对是件小事。链接问题中公认的答案是<代码>[i+str(j)表示列表1中的i表示列表2中的j]。要使它成为一个列表列表,您需要对列表1中的i执行
[[i+str(j)]对列表2中的j执行
。很少有人能在网上找到满足您精确需求的准确答案。通常,找到足够近的东西应该能够为您指明正确的方向。:)如果您认为这对于python新手来说是一个微不足道的想法,那么他根本不会问这个问题!这似乎很管用!我在第一部分没有[]的情况下试过,结果是:[“1颗心”,“1颗钻石”,“1根棍棒”,“1个黑桃”,“2颗心”,“2颗钻石”,“2根棍棒”,“2个黑桃”…“13颗心”,“13颗钻石”,“13根棍棒”,“13个黑桃”]。每张卡片上只有一张大单子。我不确定哪种解决方案是最好的。嗯,我认为这是您必须根据您对其余代码所做的事情来决定的。根据您所写的内容,我认为平面列表比嵌套列表更能帮助您。这将有助于您重新订购整个甲板。(模拟洗牌)。画一张卡片可以仅仅是
deck.pop(0)
。我没有意识到这一点!有趣。不过,在创建甲板之后,我确实遇到了一个新问题。我需要能够看到哪个玩家抽到了最高的牌,而这对于弦来说变得很困难。我建议你看看如何创建类。每个卡可以是从
类派生的对象,
卡组
可以是另一个类。您可以实现类似于
deck.shuffle
的功能。对于卡片,您可以通过实现
\uuu gt\uuuu
\uu lt\uuu
功能来检查一张卡片是否高于另一张。这很有效!虽然我不理解你的列表理解的语法。特别是这一部分:f“{number}{suit}”,在python中称为f字符串。这是一种使用变量行格式化字符串的方法。因此,
f”“
是一个前面带有格式化参数的字符串。在花括号内添加变量名时,它会将该信息打印到字符串中。因此
f“{number}{suit}”
根据for循环的该部分中
number
suit
相等的内容创建一个字符串。