列表理解而不使用iterable

时间:2012-12-19 15:02:51

标签: python list-comprehension

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

所以这就是我想要做的事情:

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

有办法做到这一点吗?

2 个答案:

答案 0 :(得分:15)

  

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

使用random.sample

  

random.sample(人口,k)

     

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

试试这个:

result = random.sample(deck, n)

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

random.shuffle(deck)

  

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

不是真的。列表comphrension保留元素的顺序,但允许您投影或过滤它们。改组不是投影或过滤器。

答案 1 :(得分: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()从卡片中选择卡片。