33

私は非常に大きな辞書を持っており、おそらく約10,000 keys/valuesであり、すべての値を同時に に変更したいと考えています0。ループしてすべての値を設定できることは承知していますが0、それには永遠に時間がかかります。すべての値を同時に設定できる方法はありますか?0

ループ方式、非常に遅い:

# example dictionary
a = {'a': 1, 'c': 1, 'b': 1, 'e': 1, 'd': 1, 'g': 1, 'f': 1, 'i': 1, 'h': 1, 'k': 1,
 'j': 1, 'm': 1, 'l': 1, 'o': 1, 'n': 1, 'q': 1, 'p': 1, 's': 1, 'r': 1, 'u': 1,
 't': 1, 'w': 1, 'v': 1, 'y': 1, 'x': 1, 'z': 1}
for key, value in a.items():
    a[key] = 0

出力:

{'a': 0, 'c': 0, 'b': 0, 'e': 0, 'd': 0, 'g': 0, 'f': 0, 'i': 0, 'h': 0, 'k': 0,
 'j': 0, 'm': 0, 'l': 0, 'o': 0, 'n': 0, 'q': 0, 'p': 0, 's': 0, 'r': 0, 'u': 0,
 't': 0, 'w': 0, 'v': 0, 'y': 0, 'x': 0, 'z': 0}
4

5 に答える 5

62

あなたが欲しいdict.fromkeys()

a = dict.fromkeys(a, 0)
于 2012-12-04T21:28:58.743 に答える
5

コメントをありがとう@akaRem:)

a = dict.fromkeys( a.iterkeys(), 0 )
于 2012-12-04T21:31:52.090 に答える
1

キーの順序が重要な場合は、順序が変更されているように見えるため、ソリューションが適切でない可能性があることに注意してください。

これが起こらないようにするには、リスト内包表記を使用します。

aDictionary =  { x:0 for x in aDictionary}

注: 2.7.x および 2.x 専用です。

于 2016-09-08T10:27:43.370 に答える
0

dict 値が必要なタイプがわかっている場合は、次のようにすることができます。

  1. dict 値を array.array オブジェクトに格納します。これは、メモリの連続ブロックを使用します。
  2. 実際の値を保存するのではなく、実際の値が見つかる配列インデックスを保存します
  3. 連続するゼロのバイナリ文字列で配列を再初期化する

パフォーマンスをテストしませんでしたが、より高速になるはずです...


import array

class FastResetDict(object):

    def __init__(self, value_type):
        self._key_to_index = {}
        self._value_type = value_type
        self._values = array.array(value_type)

    def __getitem__(self, key):
        return self._values[self._key_to_index[key]]

    def __setitem__(self, key, value):
        self._values.append(value)
        self._key_to_index[key] = len(self._values) - 1

    def reset_content_to_zero(self):
        zero_string = '\x00' * self._values.itemsize * len(self._values)
        self._values = array.array(self._value_type, zero_string)



fast_reset_dict = FastResetDict('i')
fast_reset_dict['a'] = 103
fast_reset_dict['b'] = -99

print fast_reset_dict['a'], fast_reset_dict['b']
fast_reset_dict.reset_content_to_zero()
print fast_reset_dict['a'], fast_reset_dict['b']
于 2012-12-04T22:29:54.127 に答える
0

@Daniel Rosemanの回答を拡張するa=a.fromkeys(d,0)と、機能は同じで、少し高速です。また、これを頻繁に実行する予定があり、場合によってはどちらが高速かsave=dict.fromkeys(a,0)を呼び出すa=save.copy()場合 (大きな辞書)

于 2018-10-03T14:12:56.327 に答える