161
def shuffle(self, x, random=None, int=int):
    """x, random=random.random -> shuffle list x in place; return None.

    Optional arg random is a 0-argument function returning a random
    float in [0.0, 1.0); by default, the standard random.random.
    """

    randbelow = self._randbelow
    for i in reversed(range(1, len(x))):
        # pick an element in x[:i+1] with which to exchange x[i]
        j = randbelow(i+1) if random is None else int(random() * (i+1))
        x[i], x[j] = x[j], x[i]

関数を実行するshuffleと、次のエラーが発生します。なぜですか?

TypeError: 'dict_keys' object does not support indexing
4

5 に答える 5

259

明らかに、関数に渡してd.keys()いますshuffle。おそらくこれはpython2.xで書かれたものです(d.keys()リストを返す場合)。python3.x では、よりも によく似た動作をするオブジェクトをd.keys()返します。そのため、インデックスを作成することはできません。dict_keyssetlist

解決策は、 に渡すlist(d.keys())(または単にlist(d)) ことshuffleです。

于 2013-06-26T14:19:04.113 に答える
13

somedict.keys()の結果を関数に渡しています。Python 3 ではdict.keys、リストは返されませんが、辞書のキーのビューを表し、(セットのような) インデックス作成をサポートしないセットのようなオブジェクトです。

問題を解決するには、 を使用list(somedict.keys())してキーを収集し、それを処理します。

于 2013-06-26T14:19:28.943 に答える
11

イテラブルをリストに変換すると、コストがかかる場合があります。代わりに、最初のアイテムを取得するには、次を使用できます。

next(iter(keys))

または、すべてのアイテムを反復処理する場合は、次を使用できます。

items = iter(keys)
while True:
    try:
        item = next(items)
    except StopIteration as e:
        pass # finish
于 2017-10-10T07:54:09.663 に答える