Me preguntaba cómo obtener valores dependiendo de "dos" claves, cuando tienes un diccionario en un diccionario. es decir.:

street_dict ={"streetA": ["HouseA1", "HouseA2"],
              "streetB": ["HouseB1", "HouseB2"]}

house_dict = {"HouseA1" : ["Jack", "Jones", "Joel"],
              "HouseA2" : ["Paul", "Lucas", "Martin"],
              "HouseB1" : ["Rick", "Jordan", "Michael"],
              "HouseB2" : ["Peter", "George", "Toni"]}
  • ¿Cómo saber dónde vive Rick? (Casa y calle)
  • ¿Cuál es la forma más rápida de obtener todas las personas de StreetS?
2
CRoNiC 30 sep. 2019 a las 11:42

3 respuestas

La mejor respuesta
  • ¿Cómo saber dónde vive Rick? (Casa y calle)

Podrías usar una lista de comprensión:

[(hs,st) for st, j in street_dict.items() for hs in j if 'Rick' in set(house_dict[hs])]
# [('HouseB1', 'streetB')]
  • ¿Cuál es la forma más rápida de obtener todas las personas de StreetA?

De manera similar al enfoque anterior:

from itertools import chain

list(chain.from_iterable([house_dict[house] for house in street_dict["streetA"]]))
# ['Jack', 'Jones', 'Joel', 'Paul', 'Lucas', 'Martin']
2
yatu 30 sep. 2019 a las 08:52

Encuentra a Rick. No usar la comprensión de la lista:

def find_person(name):
    for house, persons in house_dict.items():
        if name in persons:
            for street, houses in street_dict.items():
                if house in houses:
                    print("{} lives at {} {}".format(name, house, street))

Obtenga todas las personas en una calle:

def get_persons(street):
    persons = []
    for house in street_dict.get(street, []):
        persons.extend(house_dict.get(house, []))
    return persons
0
Frederik Højlund 30 sep. 2019 a las 09:02

Puede reconstruir sus datos en un diccionario más adecuado

hs = {house:street for street,houses in street_dict.items() for house in houses}
s = {person: {'street':hs[house], 'house':house} for house, persons in house_dict.items() for person in persons}
# {'Jack': {'street': 'streetA', 'house': 'HouseA1'}, 'Jones': {'street': 'streetA', 'house': 'HouseA1'},..

Entonces su consulta será

# where lives Jordan    
print(s['Jordan'])
# all persons of StreetA
print([person for person, address in s.items() if address['street'] == 'streetA'])
1
splash58 30 sep. 2019 a las 10:43
58164333