2

私はpythonを学ぼうとしています(VBAのバックグラウンドがあります)。

次の関数をインタープリターにインポートしました。

def shuffle(dict_in_question):  #takes a dictionary as an argument and shuffles it
    shuff_dict = {}
    n = len(dict_in_question.keys())
    for i in range(0, n):
        shuff_dict[i] = pick_item(dict_in_question)
    return shuff_dict

以下は私の通訳のプリントです。

>>> stuff = {"a":"Dave", "b":"Ben", "c":"Harry"}
>>> stuff
{'a': 'Dave', 'c': 'Harry', 'b': 'Ben'}
>>> decky11.shuffle(stuff)
{0: 'Harry', 1: 'Dave', 2: 'Ben'}
>>> stuff
{}
>>> 

辞書がシャッフルされたように見えますが、その後、辞書は空になります。なんで?それとも、私の使い方が悪いのでしょうか?

4

2 に答える 2

3

新しい辞書を返すので、それをものにも割り当てる必要があります。

>>> stuff = decky11.shuffle(stuff)
于 2012-08-04T05:12:08.750 に答える
0

Dogbert の答えは当面の問題を解決しますが、辞書には順序がないことに注意してください。「my_dict の最初の要素」などというものはありません。( .keys() または .values() を使用するとリストが生成されますが、これには順序がありますが、辞書自体にはありません。) したがって、辞書の「シャッフル」について話すことはあまり意味がありません。

ここで実際に行ったことは、キーを文字 a、b、c から整数 0、1、2 に再マップしたことだけです。これらのキーは、最初に使用したキーとは異なるハッシュ値を持っているため、異なる順序で出力されます。しかし、辞書には最初から順序がなかったので、辞書の順序を変更していません。

これを最終的に使用する目的に応じて (キーを反復処理していますか?)、より直接的なことを行うことができます。

shufflekeys = random.shuffle(stuff.keys())
for key in shufflekeys:
    # do thing that requires order

補足として、辞書 (別名ハッシュ テーブル) は非常に巧妙で非常に便利なデータ構造です。まだ慣れていない場合は、深く学習することをお勧めします。優れたハッシュ関数 (および非病理学的データ) は、O(1) (つまり、定数) のルックアップ時間を提供します。十品!順序の欠如は、この速度を可能にする辞書の重要な機能です。

于 2012-08-04T18:31:50.490 に答える