に変更する場合は、既存のリスト/ディクショナリを使用します。リスト/ディクショナリの使用は、不要なスローアウェイリスト/ディクショナリを作成するため、不適切なスタイルとみなされます。
正確には、私は次のについて話している:あなたが見ることができるように
>>> demo = ['a', 'b', 'c']
>>> freqdist = {'a': 0, 'b': 1, 'c': 2}
>>> [freqdist.__setitem__(key, freqdist[key] + 1) for key in demo]
[None, None, None]
>>> freqdist
{'a': 1, 'c': 3, 'b': 2}
は、あなたが可能である記述する何をして、それはあなたが何をすべきかではありません、それ
- 理由それは読むのが難しい
- それは未使用のスローアウェイリストを作成します
[None, None, None]
- あなたは実際には新しいリストを構築するためにリストの補完を使用する必要がありますeed
辞書の理解度を持つ新しい辞書を作成することは、すべての値をインクリメントする必要はないため(唯一の単語はdemo
)、迷惑です。 freqdist
の各キーのために私たちはdemo
ためのO(len(demo)
)メンバーシップのテストを行うため
あなたはは
>>> demo = ['a', 'b', 'c']
>>> freqdist = {'a': 0, 'b': 1, 'c': 2}
>>> freqdist = {k:v + (k in demo) for k,v in freqdist.items()}
>>> freqdist
{'a': 1, 'c': 3, 'b': 2}
を行うしかし、我々は今、次善のランタイムの複雑さを持つことができます。
あなたはが、demo
の要素が一意である場合にのみ、O(len(freqdist)
)に辞書建物の複雑さを軽減するためにdemo
ためset
を使用することができます。
>>> demo = set(['a', 'b', 'c'])
>>> freqdist = {'a': 0, 'b': 1, 'c': 2}
>>> freqdist = {k:v + (k in demo) for k,v in freqdist.items()}
>>> freqdist
{'a': 1, 'c': 3, 'b': 2}
私はこの解決法も特に優雅だとは思わない。
結論として、あなたのfor
ループは完璧です。これは私が個人的に使用するソリューションです
>>> from collections import Counter
>>> demo = ['a', 'b', 'c']
>>> freqdist = Counter({'a': 0, 'b': 1, 'c': 2})
>>> freqdist.update(demo)
>>> freqdist
Counter({'c': 3, 'b': 2, 'a': 1})
:唯一の良い選択肢は、あなたが更新Counter
オブジェクトを使用することです。
[カウンタ](httpsを使用します: //docs.python.org/2/library/collections.html#collections.Counter)? – asongtoruin
リスト内包は新しいリストを作成します。ここでリストを作成したいとは思われません。 – ikkuh
'for'ループの何が問題ですか?リスト内包表記は、リストを作成するためのものであり、 'for'ループの代用品ではありません。あなたが副作用を利用しようとしているように見えます。 – roganjosh