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í.