2012-12-19 15 views
2

我想通过从另一个列表中选择没有重复的随机元素来构建一个列表。想洗牌一副牌。我显然可以为此写一些unpythonic代码,我不想这样做。没有使用迭代的列表理解

因此,这里是我想做的事:

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

有没有办法做到这一点?

+5

'random.shuffle()'怎么样? – alexvassel

+0

对于初学者来说,定义执行次数是多少? – delnan

+0

@alexvassel FFFFUUUUU。虽然谢谢!仍然好奇,如果这可以使用列表理解虽然! – ritratt

回答

15

我想通过从另一个列表中选取无重复的随机元素来构建一个列表。

使用random.sample

random.sample(人口中,k)从所述总体序列选择独特元件的

返回第k长度列表。用于无需更换的随机抽样。

试试这个:

result = random.sample(deck, n) 

洗牌整个列表使用random.shuffle

random.shuffle(deck) 

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

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

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 

选秀权(甲板)主从甲板上的卡,如果你想重新甲板使用resetDeck()。 执行后,使用pick(deck).next()从卡组中选择卡。