2

我正在尝试通过从另一个没有重复的列表中选择随机元素来构建一个列表。想想洗一包纸牌。我显然可以为此编写一些非 Python 的代码,但我不想这样做。

所以这就是我想要做的:

new = [deck[i] where 0<(i = some_rand_int)<51 if new.count(deck[i]) == 0]

有没有办法做到这一点?

4

2 回答 2

15

我正在尝试通过从另一个没有重复的列表中选择随机元素来构建一个列表。

使用random.sample

随机样本(人口,k)

返回从总体序列中选择的唯一元素的 ak 长度列表。用于无放回的随机抽样。

尝试这个:

result = random.sample(deck, n)

要随机播放整个列表,请使用random.shuffle

random.shuffle(deck)

仍然很好奇这是否可以使用列表理解来完成!

并不真地。列表包含保留元素的顺序,但允许您投影或过滤它们。洗牌不是投影或过滤器。

于 2012-12-19T15:06:09.747 回答
2

您可以为此使用生成器:

import random

def pick(deck):
    while True:
        try:
            newCard = random.choice(deck)
            deck.remove(newCard)
        except:
            print 'deck is empty...'
        yield newCard

def resetDeck():
    deck = []
    newCard = None
    for i in range(1,53):
        deck.append(i)
    return deck

pick(deck) 从牌组中挑选一张牌,如果你想重新创建牌组,请使用 resetDeck()。实施后,使用 pick(deck).next() 从甲板中选择卡片。

于 2012-12-19T16:10:32.673 回答