Istnieją 3 typy wpisów w zagnieżdżonym domyślnym dykcie a
struktury a=defaultdict(lambda: defaultdict(list))
.
for i in a:
print a[i]
defaultdict(<type "list">, {"ldap_uidnumber": [["10002"]], "file": ["ABC", "xyz"]})
defaultdict(<type "list">, {"ldap_uidnumber": [], "file": ["abcd"]})
defaultdict(<type "list">, {"file": ["/home/testuser/.ssh/id_rsa.pub"]})
- Jak odfiltrować drugi, za pomocą
ldap_uidnumber: []
? - Jak odfiltrować trzeci bez klucza
ldap_uidnumber
w ogóle?
Kod, który próbowałem:
for i in a:
if a[i]["ldap_uidnumber"] and a[i]["ldap_uidnumber"] == []:
print i
Ale to nic nie wypisuje, ale tworzy klucz w trzeciej wartości po tym kodzie i wygląda na to
defaultdict(<type "list">, {"ldap_uidnumber": [], "file": ["/home/testuser/.ssh/id_rsa.pub"]})
Odpowiedzi:
3 dla odpowiedzi № 1Sprawdzanie członkostwa za pomocą in
nie tworzy klucza w defaultdict. Poleciłbym to.
for i in a:
if "ldap_uidnumber" in a[i] and # shortcircuit here in your 3rd el
not a[i]["ldap_uidnumber"]: # fail here in your 1st el
# do something
4 dla odpowiedzi nr 2
Posługiwać się defaultdict.get
który nie utworzy kluczy pod nieobecność i wróci None
jeśli klucz nie istnieje lub wartość, jeśli istnieje - None
i []
są oboje False
w kontekście logicznym, więc kod staje się:
for i in a:
if a[i].get("ldap_uidnumber", []):
# It"s not missing or empty - do something...