Używam kilku punktów końcowych interfejsu API, które są bardzo szczegółowe w danych, które zwraca. Chciałbym podać podzbiór tych danych do innego fragmentu kodu w innym miejscu.Jak zamaskować zagnieżdżony słownik Pythona 3, aby zwrócić słownik zawierający tylko niektóre elementy?
Załóżmy mam podano kilka słowników tak (który mam zamiar pętli i filtr):
asset = {
'id': 1,
'name': 'MY-PC',
'owner': 'me',
'location': 'New York City',
'model': {
'id': 1,
'name': 'Surface',
'manufacturer': {
'id': 1,
'name': 'Microsoft'
}
}
}
Chcę utworzyć funkcję, która będzie miała ten słownik w, wraz z „maska”, która zostanie użyty do utworzenia nowego słownika tylko dozwolonych elementów. To może być przykładem maski (choć mogę pracować z dowolnym formacie sprawia otrzymany kod najbardziej zwięzły):
mask = {
'id': True,
'name': True,
'model': {
'id': True,
'name': True,
'manufacturer': {
'name': True
}
}
}
Funkcja powinna następnie wrócić w tym:
mask = {
'id': 1,
'name': 'MY-PC',
'model': {
'id': 1,
'name': 'Surface',
'manufacturer': {
'name': 'Microsoft'
}
}
}
Czy coś już zbudowany w Pythonie 3, które pomogłyby w tym pomóc? Wygląda na to, że jeśli będę musiał to zrobić ręcznie, stanie się to dość brzydkie. Znalazłem itertools.compress
, ale wygląda na to, że jest to lista i nie radzi sobie ze złożonością słowników.
Czy słyszałeś o ['jq (1)'] (https://stedolan.github.io/jq/)? – o11c
Co powinno się stać, gdy klawisze maski nie mają pasującego klucza danych? –