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 № 1A 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.