/ / Słownik Pythona dodaj wartość / optimize - python, pętle, optymalizacja, słownik

Słownik Pythona dodaje wartość / optymalizuje - python, pętle, optymalizacja, słownik

Chcę znaleźć numer tags w wielowymiarowej tablicy. Robię to w ten sposób:

l["users"] to moje dane (tablica)

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

Czy jest jakiś czystszy lub szybszy sposób na napisanie tego kodu?

Odpowiedzi:

3 dla odpowiedzi № 1

A co z tym szybkim i pytonicznym rozwiązaniem z jedną linią collections.Counter ():

Licznik jest podrzędną podklasą do liczenia obiektów haszowalnych. To jest kolekcja nieuporządkowana, w której elementy są przechowywane jako klucze słownika i ich liczby są przechowywane jako wartości słownika.

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

PRÓBNY:

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 dla odpowiedzi nr 2

Użyć collections.defaultdict(int), który będzie używał 0 jako wartość domyślna dla każdego klucza, który nie ma już takiego klucza:

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

Również, if tags.get(t) to zły sposób na sprawdzenie, czy t jest kluczem tags, zwłaszcza że „nie powiedzie się w żadnym kontekście, w którym wartość może być uznana za fałszywą w kontekście boolowskim.

if t in tags:

0 dla odpowiedzi № 3

collections.Counter jest dobry do liczenia rzeczy.