【问题标题】:The result of a function MINUS the result of another function? [duplicate]一个函数的结果减去另一个函数的结果? [复制]
【发布时间】:2022-01-26 08:41:30
【问题描述】:

假设我有一组 54 张卡片。

我想进行 2 张卡片的初始分配。

然后,我想重新分配 3 张卡,但是这三张新卡必须与最初分配的 2 张卡不同。

等等……

在全球范围内,每次分发时,分发的卡片都会从 52 张卡片组中出来。每次发行时都会更新 52 张牌。

这是我的代码,但尽管进行了大量研究,但我对 Python 的了解还不够,无法找到解决方案。

import random

cards = ["2 coeur", "3 coeur", "4 coeur", "5 coeur", "6 coeur", "7 coeur", "8 coeur", "9 coeur", "10 coeur", "Valet coeur", "Dame coeur", "Roi coeur", "A1 coeur",
          "2 trèfle", "3 trèfle", "4 trèfle", "5 trèfle", "6 trèfle", "7 trèfle", "8 trèfle", "9 trèfle", "10 trèfle", "Valet trèfle", "Dame trèfle", "Roi trèfle", "A1 trèfle",
          "2 carreau", "3 carreau", "4 carreau", "5 carreau", "6 carreau", "7 carreau", "8 carreau", "9 carreau", "10 carreau", "Valet carreau", "Dame carreau", "Roi carreau", "A1 carreau",
          "2 pique", "3 pique", "4 pique", "5 pique", "6 pique", "7 pique", "8 pique", "A9 pique", "10 pique", "Valet pique", "Dame pique", "Roi pique", "A1 pique"]

first_card = (random.choices(cartes, k = 1))
second_card = (random.choices(cartes, k = 1))

first_distri = first_card + second_card

print(first_distri)

second_distri = (random.choices(cartes, k = 3)) #AND ????

我想到了一个命令,例如“exept”:

second_distri = (random.choices(cartes, k = 3)) EXCEPT first_distri.

但我不确定它是否存在。

我用 if/else 尝试了不同的方法,但没有任何效果。

【问题讨论】:

  • 您可以只使用remove 卡片,这样您就可以始终使用可以使用的卡片。另外,您可以使用 choice(l) 而不是 choices(l, k=1)
  • 你也可以只 shuffle 列表并按顺序迭代它

标签: python


【解决方案1】:

您可以使用以下方法从列表中删除已选择的卡片:

cards.remove(first_card)
cards.remove(second_card)

或者,根据您的“除外”(设置减法-y)思路:

second_distri = (random.sample([card for card in cartes if card not in first_distri], k = 3))

根据@Tomerikoo 的建议,在此处使用sample 而不是choices,以避免两次选择同一张卡。

还注意到@Tomerikoo 的建议:此方法需要对列表进行多次迭代(一次选择带有choices 的卡片,然后再次选择remove 它),因此更有效的解决方案是将列出(使用 random 模块的 shuffle 函数),选择其中的第一个(或最后一个)元素,然后对包含这些元素的部分进行切片。

【讨论】:

  • 这是我试过的,但这里是错误:ValueError: list.remove(x): x not in list
  • @Sooon:将您的 cartes.choices 更改为 cartes.choice,或者:cards.remove(first_card[0])choices 返回一个列表。 :)
  • 请注意,choices 是替换。所以second_distri 内部可能有重复。您可能想使用sample
  • 还要注意,使用remove 效率不高。您需要首先使用choices 迭代列表,然后再次迭代以查找并删除该项目。更好的方法是简单地shuffle 列表,然后根据需要对其进行迭代/切片(如副本中所述)
  • 感谢您的笔记,@Tomerikoo!我将它们添加到答案中,并带有适当的学分。 :) 我曾考虑过remove 问题,但我认为我会选择简单(从某种意义上说,它与 OP 的思维方式并没有太大偏差;这个想法是帮助他们了解如何在想法和实现),但你是对的:应该注意。至于choices,我几乎没用过这个功能,所以我不知道。感谢您的提醒!
【解决方案2】:

初始化 first_card 后,将其从列表中删除,然后是第二个,依此类推

【讨论】:

    猜你喜欢
    • 2013-09-24
    • 2022-07-25
    • 1970-01-01
    • 2020-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多