2017-08-19 9 views
1

作業スクリプトからのコードスニペット。私は、同じ結果を達成するために「もっときれいな」方法があるのであれば、興味があります。 awkでは辞書を構築するときに値をインクリメントするPythonic方法

if ctry in countries: 
     countries[ ctry ] += 1 
    else: 
     countries[ ctry ] = 1 

私はちょうどcountries[ ctry ] += 1を使用することもできましたが、Pythonはキー・エラー(当然)を投げました。

+0

[指定したキーが既に辞書に存在するかどうかを確認し、それをインクリメント](https://stackoverflow.com/q/473099/2301450) – vaultah

+0

そのために[collections.Counter](https://docs.python.org/3/library/collections.html#collections.Counter)が必要な場合があります。 –

答えて

3

ではなく、通常の辞書を使用して、あなたの代わりにcollections.defaultdict対象となるcountriesを変更することができます。名前が示すように、collections.defaultdictはキーがまだ存在しない場合は、あなたの辞書に挿入されたデフォルト値を持つことができます:あなたができる場合は

countries[cntry] += 1 

from collections import defaultdict 
countries = defaultdict(int) 

その後、あなたsnippitは、1行になります

try: 
    countries[ ctry ] += 1 
except KeyError: 
    countries[ ctry ] = 1 

上記はあなたの条件のように動作しますが「tはcollections.defaultdictを使用し、あなたの代わりにイディオム 『赦しではなく、許可を求める』を使用することができますより具体的には、if/elseではなくtry/exceptが使用されるため、より「Pythonic」とみなされます。

2

次はもう少しニシキヘビです:

countries[ctry] = 1 if ctry not in countries else countries[ctry] + 1 

それとも

countries[ctry] = countries.get(ctry, 0) + 1 
1

別のオプションはdefaultdictを使用することです:

from collections import defaultdict 
countries = defaultdict(int) 
countries[ctry] += 1 

スピードテスト:

%timeit countries['Westeros'] += 1 
10000000 loops, best of 3: 79 ns per loop 

countries = {} 
%timeit countries['Westeros'] = countries.get('Westeros', 0) + 1 
1000000 loops, best of 3: 164 ns per loop 
関連する問題