6

だから私は Python 経由で多肢選択式クイズを設定しようとしています。私は Python にかなり慣れていないので、これを行う簡単な方法があれば、前もってお詫び申し上げます。ただし、新しいテクニックに進む前に、いくつかの基本を本当に理解しようとしています。

私は辞書を持っています。この辞書では、3 つのランダムなキーを取得します。また、これら 3 つのキーが等しくないこと (つまり、互いにランダムであること) も確認したいと思います。これまでに書いたコードは次のとおりです。

import random

word_drills = {'class': 'Tell Python to make a new kind of thing.',
               'object': 'Two meanings: the most basic kind of thing, and any instance of some thing.',
               'instance': 'What you get when you tell Python to create a class.',
               'def': 'How you define a function inside a class.',
               'self': 'Inside the functions in a class, self is a variable for the instance/object being accessed.',
               'inheritance': 'The concept that one class can inherit traits from another class, much like you and your parents.',
               'composition': 'The concept that a class can be composed of other classes as parts, much like how a car has wheels.',
               'attribute': 'A property classes have that are from composition and are usually variables.',
               'is-a': 'A phrase to say that something inherits from another, as in a Salmon *** Fish',
               'has-a': 'A phrase to say that something is composed of other things or has a trait, as in a Salmon *** mouth.'}

key1 = ' '
key2 = ' '
key3 = ' '             

def nodupchoice():
    while key1 == key2 == key3: 
        key1 = random.choice(word_drills.keys())
        key2 = random.choice(word_drills.keys())
        key3 = random.choice(word_drills.keys())


nodupchoice()

print "Key #1: %s, Key #2: %s, Key #3: %s" % (key1, key2, key3)

問題はwhileループにあると確信しています。3 つのキーすべてが互いに異なるものになるまで実行し続ける関数を作成したかったのです。最後に、結果を出力します。何か案は?前もって感謝します。

4

6 に答える 6

12

使用できますrandom.sample

>>> random.sample(word_drills, 3)
['has-a', 'attribute', 'instance']

必要はありません.keys()。辞書に対する反復はキーに対するものです。

random.sample指定したリストから 3 つの一意の値が返されることに注意してください(つまり、 'has-a'2 回返されることはありません)。

>>> all(len(set(random.sample(word_drills, 3))) == 3 for i in range(10**5))
True
于 2012-08-18T21:05:34.303 に答える
3

使用するrandom.sample

>>> import random
>>> random.sample([1,2,3,4,5,6], 3)
[4, 5, 2]
于 2012-08-18T21:04:50.803 に答える
0

他の人が説明しrandom.sampleたように、あなたが望むことをするための最良の方法です。

元のコードが機能しなかった理由を説明するには:

最初の問題は、whileループに論理エラーがあります。2 つの項目が異なるとすぐに終了します (たとえば'a' == 'a' == 'b'、True でループが終了します)。これを修正するには、いくつかの方法があります。

while not (key1 != key2 != key3):

または、 a にsetは一意のアイテムのみを含めることができるため、 の長さset([key1, key2, key3])が 3 の場合、3 つの値はすべて異なります。

while len(set([key1, key2, key3]) != 3:

2 番目の問題、およびコードの実行が拒否される理由:

key1 key2 key3グローバル変数として定義されます (key1 = ' ' are at the top-level of your関数ではなく .py` ファイル)

関数内のグローバル変数を問題なく検索できます(行った場所のようにwhile key1 == key2 ...)。エラーが発生するのは、ループ内で to も割り当てようとするためです。これkey1、Python のパーサーを混乱させます。これは、そのwhile key1 == ...部分でグローバル変数を検索しているが、次の行で新しい関数ローカル変数を作成しようとしているため、役立つようにスローされますエラー。

これを修正するごみの方法は次のようになります。

key1 = ' '
key2 = ' '
key3 = ' '             

def nodupchoice():
    global key1
    global key2
    global key3
    while not (key1 != key2 != key3):
        key1 = random.choice(word_drills.keys())
        key2 = random.choice(word_drills.keys())
        key3 = random.choice(word_drills.keys())

その後、意図したとおりに機能しますが、そうしないでください-グローバル変数には用途がありますが、これはそのような状況ではありません..

グローバル変数を使用する代わりに、関数から複数の値を簡単に返すことができます。

def nodupchoice():
    key1 = ' ' # local variables, which are inaccessible outside this function
    key2 = ' '
    key3 = ' '

    while not (key1 != key2 != key3):
        key1 = random.choice(word_drills.keys())
        key2 = random.choice(word_drills.keys())
        key3 = random.choice(word_drills.keys())

    return key1, key2, key3


key1, key2, key3 = nodupchoice()

print "Key #1: %s, Key #2: %s, Key #3: %s" % (key1, key2, key3)

ああ、さらに良いことにword_drills、引数としてを渡すことができます。

def nodupchoice(things):
    key1 = ' ' # local variables, which are inaccessible outside this function
    key2 = ' '
    key3 = ' '

    while not (key1 != key2 != key3):
        key1 = random.choice(things)
        key2 = random.choice(things)
        key3 = random.choice(things)

    return key1, key2, key3


key1, key2, key3 = nodupchoice(word_drills)

...そして、あなたはrandom.sample(word_drills, 3)!とほとんど同じ関数を書きました。

于 2012-08-18T21:35:03.733 に答える
0

おそらく最も簡単なことはshuffle、キーを使用することです。

keysShuffled = list(word_drills)
random.shuffle(keysShuffled)

次に、最初の 3 を取得します。

threeUnique = keysShuffled[:3]
于 2012-08-18T21:05:46.603 に答える
0

Quiz Me 2.5を試してみませんか?Python 3.x の GUI を使用した多肢選択式クイズ システムです。

于 2012-08-18T21:21:36.457 に答える