Je travaille sur des devoirs en python et on me demande de définir une fonction qui prend un dictionnaire qui mappe les itinéraires de bus aux arrêts de bus et renvoie un dictionnaire mappant les arrêts de bus à la liste des itinéraires de bus qui s'arrêtent à cet arrêt. L'entrée serait quelque chose comme ceci:

{"Lentil": ["Chinook", "Orchard", "Valley", "Emerald","Providence",
"Stadium", "Main", "Arbor", "Sunnyside", "Fountain", "Crestview",
"Wheatland", "Walmart", "Bishop", "Derby", "Dilke"],
"Wheat": ["Chinook", "Orchard", "Valley", "Maple","Aspen", "TerreView",
"Clay", "Dismores", "Martin", "Bishop", "Walmart", "PorchLight",
"Campus"]}

Je dois en quelque sorte transformer les valeurs en clés et en même temps vérifier si ces valeurs sont également des valeurs dans une autre clé. Fondamentalement, j'ai du mal à essayer de comprendre comment je peux accéder aux valeurs et en faire les nouvelles clés (pas de doublons) sans vraiment les coder en dur.

1
Larry.Fish 12 mars 2019 à 02:51

2 réponses

Meilleure réponse

C'est en fait très simple si vous utilisez Dictionary et Compréhension de liste. Vous pouvez obtenir la sortie requise sur une seule ligne.

d1={"Lentil": ["Chinook", "Orchard", "Valley", "Emerald","Providence",
"Stadium", "Main", "Arbor", "Sunnyside", "Fountain", "Crestview",
"Wheatland", "Walmart", "Bishop", "Derby", "Dilke"],
"Wheat": ["Chinook", "Orchard", "Valley", "Maple","Aspen", "TerreView",
"Clay", "Dismores", "Martin", "Bishop", "Walmart", "PorchLight",
"Campus"]}
d2={x:[y for y in d1.keys() if x in d1[y]] for l in d1.values() for x in l}
print(d2)

Une compréhension plus lisible mais plus longue

d2={stop:[route for route in d1.keys() if stop in d1[route]] for stop_list in d1.values() for stop in stop_list}

Production:

{'Chinook': ['Lentil', 'Wheat'], 'Orchard': ['Lentil', 'Wheat'], 'Valley': ['Lentil', 'Wheat'], 'Emerald': ['Lentil'], 'Providence': ['Lentil'], 'Stadium': ['Lentil'], 'Main': ['Lentil'], 'Arbor': ['Lentil'], 'Sunnyside': ['Lentil'], 'Fountain': ['Lentil'], 'Crestview': ['Lentil'], 'Wheatland': ['Lentil'], 'Walmart': ['Lentil', 'Wheat'], 'Bishop': ['Lentil', 'Wheat'], 'Derby': ['Lentil'], 'Dilke': ['Lentil'], 'Maple': ['Wheat'], 'Aspen': ['Wheat'], 'TerreView': ['Wheat'], 'Clay': ['Wheat'], 'Dismores': ['Wheat'], 'Martin': ['Wheat'], 'PorchLight': ['Wheat'], 'Campus': ['Wheat']}
2
Bitto Bennichan 12 mars 2019 à 00:47

Donc, si j'ai bien compris la question, vous voulez trouver des arrêts le long des itinéraires, où il y a des arrêts visités par le même bus, ce qui trouve essentiellement la duplication des itinéraires de bus.

Veuillez voir le code ci-dessous.

bus_routes = {"Lentil": ["Chinook", "Orchard", "Valley", "Emerald","Providence", "Stadium", "Main", "Arbor", "Sunnyside", "Fountain", "Crestview", "Wheatland", "Walmart", "Bishop", "Derby", "Dilke"], "Wheat": ["Chinook", "Orchard", "Valley", "Maple","Aspen", "TerreView", "Clay", "Dismores", "Martin", "Bishop", "Walmart", "PorchLight", "Campus"]}
route_dup = {}
for x,y in bus_routes.items():
    for z in y:
        try:
            if route_dup[z]:
                route_dup[z].append(x)
        except KeyError:
            route_dup[z] = [x]

print(route_dup)

Nous obtenons une variable (y) à partir de l'itération avec bus_routes.items()x est le nom de l'itinéraire et y est la liste des noms d'arrêt. Nous créons ensuite une autre itération avec y et essayons de voir si une clé avec ce nom d'arrêt existe déjà dans route_dup et si elle n'existe pas, elle intercepte le KeyError et la crée avec la valeur du nom de la route dans la liste, cependant, si la clé existe, nous pouvons dire en toute sécurité que ce sera la liste que nous avons déjà créée, et donc append(), avec le nom de la route suivante.

J'espère que cela t'aides.

1
Swift 12 mars 2019 à 00:43