0

tags多次元配列の数を見つけたい。私はこのようにします:

l['users']私のデータ(配列)です

tags = {}
for u in l['users']:
    for p in u['photos']:
        for t in p['tags']:
            if tags.get(t):
                tags[t] +=1
            else:
                tags[t] = 1

そのコードを書くためのよりクリーンで高速な方法はありますか?

4

3 に答える 3

3

collections.Counter()を使用したこの高速でPythonicなワンライナーソリューションはどうですか:

Counter は、ハッシュ可能なオブジェクトをカウントするための dict サブクラスです。これは、要素がディクショナリ キーとして格納され、そのカウントがディクショナリ値として格納される順序付けられていないコレクションです。

Counter(t for u in l['users'] for p in u['photos'] for t in p['tags'])

デモ:

from collections import Counter

l = {'users': [{'photos': [{'tags': [1,2,3,4,5]}, {'tags': [3,4,5]}]},
               {'photos': [{'tags': [1]}, {'tags': [2,3,4,5]}]}]}

tags = Counter(t for u in l['users'] for p in u['photos'] for t in p['tags'])
print tags  # prints Counter({3: 3, 4: 3, 5: 3, 1: 2, 2: 2})
于 2013-08-31T22:23:46.337 に答える
1

を使用します。これは、まだキーを持っていないキーのデフォルト値として使用されますcollections.defaultdict(int)0

import collections
tags = collections.defaultdict(int)
for u in l['users']:
    for p in u['photos']:
        for t in p['tags']:
            tags[t] +=1

また、がのキーであるif tags.get(t)かどうかを確認する方法としては不適切です。特に、ブール値のコンテキストで値が false と見なされる可能性のあるコンテキストでは失敗するためです。以下を優先します。ttags

if t in tags:
于 2013-08-31T22:23:41.043 に答える
0

collections.Counterは、ものを数えるのに適しています。

于 2013-08-31T22:23:37.697 に答える