如何从两个列表中选择UNIQUE随机选择

时间:2019-10-24 14:28:27

标签: python random

我有两个定义卡片的列表

values  =  ['A', 'K', 'Q', 'J', '10', '9', '8', '7', '6', '5', '4', '3', '2']
marks   =  ['spade', 'hearts', 'diamond', 'club']

我想拥有12张唯一卡,所以我的输出应该看起来像

('9', 'diamond')
('K', 'hearts')
('Q', 'hearts')
('7', 'spade')
('A', 'diamond')
('3', 'diamond')
('Q', 'diamond')
('3', 'hearts')
('7', 'hearts')
('2', 'diamond')
('2', 'hearts')
('5', 'spade')

我已经使用随机选择来做到这一点,我的代码在这里

count = 0
while count != 12:
    value = random.choice(values)
    mark = random.choice(marks)
    card = Card(value, mark) 
    # I have a class named Card, generate() returns a tuple of mark and value for card
    print(card.generate())
    count += 1

但是它不能为我提供独特的价值。请让我知道或通过我的资源来学习如何通过随机选择从两个列表中获得独特的价值。

3 个答案:

答案 0 :(得分:2)

首先,使用chosen_cardschosen_cardsmarks合并为实际的纸牌,然后将values的纸牌和itertools.product的纸牌放入玩家的手中就像您在现实生活中一样。

random.shuffle

同时,这将从堆叠中移除卡牌,从而确保卡牌在不同玩家的手中是唯一的。如果您不希望这样做,请改用pop。这样,卡就可以在一只手中唯一,而在两手之间却不唯一,因为它们保留在堆栈中(在这种情况下,也不需要import itertools, random cards = list(itertools.product(values, marks)) random.shuffle(cards) hand = [cards.pop() for _ in range(12)] 步骤)

random.sample

答案 1 :(得分:0)

我建议使用<NetFx40_LegacySecurityPolicy enabled="true" /> ,这将从列表Traceback (most recent call last): File "retrain.py", line 1349, in <module> tf.app.run(main=main, argv=[sys.argv[0]] + unparsed) AttributeError: 'module' object has no attribute 'app' 返回唯一的random.sample(population, k)项目。

但是,为此,您首先需要制作所有卡片,然后将所有卡片放入列表填充中。

另一种解决方案是在将新的随机卡添加到k之前,添加列表population并实现等值函数并在chosen_cards中进行检查。

答案 2 :(得分:0)

您可以这样做:

cards = [(v, m) for (v, m) in zip(values * 4, marks * 13)]
random.sample(cards, 12)
# RESULT
[('K', 'diamond'),
 ('K', 'spade'),
 ('3', 'spade'),
 ('6', 'hearts'),
 ('10', 'spade'),
 ('9', 'hearts'),
 ('3', 'club'),
 ('8', 'hearts'),
 ('Q', 'spade'),
 ('Q', 'hearts'),
 ('6', 'club'),
 ('J', 'diamond')]
相关问题