[解決済み] Python : dictのリスト、存在すればdictの値をインクリメントし、存在しなければ新しいdictを追加する
質問
こんなことがしたいのですが。
list_of_urls = ['http://www.google.fr/', 'http://www.google.fr/',
'http://www.google.cn/', 'http://www.google.com/',
'http://www.google.fr/', 'http://www.google.fr/',
'http://www.google.fr/', 'http://www.google.com/',
'http://www.google.fr/', 'http://www.google.com/',
'http://www.google.cn/']
urls = [{'url': 'http://www.google.fr/', 'nbr': 1}]
for url in list_of_urls:
if url in [f['url'] for f in urls]:
urls[??]['nbr'] += 1
else:
urls.append({'url': url, 'nbr': 1})
私はどのように行うことができますか?私はそれを編集するためにタプルを取るべきか、タプルのインデックスを把握するべきか分からないのでしょうか?
何か良い方法はありませんか?
どのように解決するのですか?
それはとても奇妙な整理の仕方です。 辞書に格納されていれば、これは簡単です。
# This example should work in any version of Python.
# urls_d will contain URL keys, with counts as values, like: {'http://www.google.fr/' : 1 }
urls_d = {}
for url in list_of_urls:
if not url in urls_d:
urls_d[url] = 1
else:
urls_d[url] += 1
このカウントの辞書を更新するコードは、Pythonではよくある"パターン"です。 あまりに一般的なので、特別なデータ構造が存在します。
defaultdict
という特別なデータ構造があります。
from collections import defaultdict # available in Python 2.5 and newer
urls_d = defaultdict(int)
for url in list_of_urls:
urls_d[url] += 1
にアクセスすると
defaultdict
にアクセスし、そのキーがすでに
defaultdict
にない場合、キーは自動的にデフォルト値で追加されます。 また
defaultdict
は渡された callable を受け取り、それを呼び出してデフォルト値を取得します。 この場合、クラス
int
を渡しましたが、Pythonが
int()
を呼び出すと、ゼロの値を返します。 そのため、初めてURLを参照するときは、そのカウントはゼロに初期化され、その後カウントに1が追加されます。
しかし、カウントでいっぱいの辞書もよくあるパターンなので、Pythonはすぐに使えるクラスを提供しています。
containers.Counter
を作成するだけです。
Counter
このクラスは辞書を作成し、キーは反復記号の値、値はそのキーが反復記号の中で何回出現したかを数えるものです。 上記の例は次のようになります。
from collections import Counter # available in Python 2.7 and newer
urls_d = Counter(list_of_urls)
もし本当にあなたが示した方法で行う必要があるなら、最も簡単で早い方法は、これら3つの例のうちのどれかを使って、あなたが必要とするものを作ることでしょう。
from collections import defaultdict # available in Python 2.5 and newer
urls_d = defaultdict(int)
for url in list_of_urls:
urls_d[url] += 1
urls = [{"url": key, "nbr": value} for key, value in urls_d.items()]
Python 2.7以降を使用している場合は、ワンライナーで行うことができます。
from collections import Counter
urls = [{"url": key, "nbr": value} for key, value in Counter(list_of_urls).items()]
関連
-
[解決済み] 複数の例外を1行でキャッチする(ブロックを除く)
-
[解決済み] Pythonのリストメソッドであるappendとextendの違いは何ですか?
-
[解決済み] 辞書のリストを辞書の値でソートするにはどうしたらいいですか?
-
[解決済み] なぜList<T>を継承しないのですか?
-
[解決済み] Pythonでディレクトリが存在するかどうかを確認する方法
-
[解決済み] リストを反転させるには?
-
[解決済み] リストに値が存在するかどうかを確認する最速の方法
-
[解決済み] Pythonの「名前付きタプル」とは何ですか?
-
[解決済み] リスト内包とラムダ+フィルタの比較
-
[解決済み】PHPの'foreach'は実際どのように動作するのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] PythonでのAWS Lambdaのインポートモジュールエラー
-
[解決済み] Djangoで2つの日付の間を選択する
-
[解決済み] 小数点以下1桁を取得する[重複]。
-
[解決済み] 文字列から先頭と末尾のスペースを削除するには?
-
[解決済み] ファブリック経由でデプロイユーザとしてvirtualenvを有効化する
-
[解決済み] Flaskで非同期タスクを作る
-
[解決済み] Python 言語を決定するには?
-
[解決済み] virtualenvsはどこに作成するのですか?
-
[解決済み] djangoのQueryDictをPythonのDictに変更するには?
-
[解決済み] Pythonの辞書にあるスレッドセーフについて