2

重複のない別のリストからランダムな要素を選択してリストを作成しようとしています。カードのパックをシャッフルすることを考えてください。私は明らかにこれのためにいくつかの非Pythonコードを書くことができましたが、私はしたくありません。

これが私がやろうとしていることです:

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

これを行う方法はありますか?

4

2 に答える 2

15

重複のない別のリストからランダムな要素を選択してリストを作成しようとしています。

使用random.sample

random.sample(population、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 に答える