/ / Python dictionary add in value / optimize - python, loops, optimization, dictionary

Python slovník pridať hodnotu / optimalizáciu - python, slučky, optimalizácia, slovník

Chcem zistiť počet tags vo viacrozmernom poli. Robím to takto:

l["users"] sú moje údaje (pole)

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

Existuje nejaký čistejší alebo rýchlejší spôsob zápisu tohto kódu?

odpovede:

3 pre odpoveď č. 1

Čo takhle rýchle a pythonické jednopodlažné riešenie s použitím collections.Counter ():

Počítadlo je podtrieda diktátov na počítanie hašovateľných objektov. Je to neusporiadaná kolekcia, kde sú prvky uložené ako kľúče slovníka a ich počty sa ukladajú ako hodnoty slovníka.

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

DEMO:

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})

1 pre odpoveď č. 2

Použite a collections.defaultdict(int), ktoré využijú 0 ako predvolená hodnota pre akýkoľvek kľúč, ktorý ešte žiadny nemá:

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

tiež if tags.get(t) je zlý spôsob, ako skontrolovať, či t je kľúčom tags, najmä preto, že zlyhá v akomkoľvek kontexte, kde by hodnota mohla byť považovaná za nepravdivú v booleovskom kontexte. Uprednostňujte nasledujúce:

if t in tags:

0 pre odpoveď č. 3

collections.Counter je dobré na počítanie vecí.