1
votes

Python: Comment parcourir 3 listes

Faire un cours à mon époque appelé GeoPython 2018 et je suis très coincé sur la leçon 3, exercice 3.

Le contenu jusqu'à présent était des déclarations conditionnelles, des boucles et des listes (pas de dictionnaires) .

LE PROBLEME :

On nous demande de prendre une liste de noms de stations météorologiques, une liste de latitudes et une liste de longitudes et de les diviser en 4 régions (NE, NW, SE, SW) définies par les seuils.

data = [{'station':stat, 'latitude': lat, 'longitude': lon}
    for stat, lat, lon in zip(stations, lats, lons)
   ]

Le résultat final est de remplir les listes suivantes avec des noms de stations correctement attribués:

north_west = []
north_east = []
south_west = []
south_east = []

J'y suis depuis peut-être 3-4 heures sans progrès, j'ai essayé d'utiliser des dictionnaires

# Station names
stations = ['Hanko Russarö', 'Heinola Asemantaus', 'Helsinki Kaisaniemi', 
        'Helsinki Malmi airfield', 'Hyvinkää Hyvinkäänkylä', 'Joutsa Savenaho', 
        'Juuka Niemelä', 'Jyväskylä airport', 'Kaarina Yltöinen', 'Kauhava airfield', 
        'Kemi Kemi-Tornio airport', 'Kotka Rankki', 'Kouvola Anjala', 
        'Kouvola Utti airport', 'Kuopio Maaninka', 'Kuusamo airport', 
        'Lieksa Lampela', 'Mustasaari Valassaaret', 'Parainen Utö', 'Pori airport', 
        'Rovaniemi Apukka', 'Salo Kärkkä', 'Savonlinna Punkaharju Laukansaari', 
        'Seinäjoki Pelmaa', 'Siikajoki Ruukki', 'Siilinjärvi Kuopio airport', 
        'Tohmajärvi Kemie', 'Utsjoki Nuorgam', 'Vaala Pelso', 'Vaasa airport', 
        'Vesanto Sonkari', 'Vieremä Kaarakkala', 'Vihti Maasoja', 'Ylitornio Meltosjärvi']

# Latitude coordinates of Weather stations  
lats = [59.77, 61.2, 60.18, 60.25, 60.6, 61.88, 63.23, 62.4,
   60.39, 63.12, 65.78, 60.38, 60.7, 60.9, 63.14, 65.99,
   63.32, 63.44, 59.78, 61.47, 66.58, 60.37, 61.8, 62.94,
   64.68, 63.01, 62.24, 70.08, 64.5, 63.06, 62.92, 63.84,
   60.42, 66.53]

 # Longitude coordinates of Weather stations 
lons = [22.95, 26.05, 24.94, 25.05, 24.8, 26.09, 29.23, 25.67, 
   22.55, 23.04, 24.58, 26.96, 26.81, 26.95, 27.31, 29.23, 
   30.05, 21.07, 21.37, 21.79, 26.01, 23.11, 29.32, 22.49, 
   25.09, 27.8, 30.35, 27.9, 26.42, 21.75, 26.42, 27.22, 
   24.4, 24.65]

# Cutoff values that correspond to the centroid of Finnish mainland
# North - South
north_south_cutoff = 64.5

# East-West
east_west_cutoff = 26.3

Mais Je ne vais pas plus loin, en plus j'ai l'impression que les organisateurs du cours veulent que les gens se concentrent sur les itérations et les conditions.

Tout conseil ou coup de pouce dans une direction serait utile. C'est aussi mon premier message alors excusez-vous s'il y a un manque de clarté.


1 commentaires

Vous avez déjà trouvé la question Comment parcourir deux listes en parallèle? , il vous suffit donc de mettre les noms dans 4 compartiments basés sur leur paire lon, lat par rapport à vos valeurs limites. Avez-vous déjà déterminé comment classer une station? Ensuite, appliquez simplement ces connaissances à toutes les stations.


4 Réponses :


0
votes

Voici l'un d'entre eux (excusez-moi si l'ouest est une longitude inférieure, puis passez> à <):

 XXX 


0 commentaires

0
votes

Le cours que vous suivez est assez généreux avec des astuces , et ils incluent des instructions sur ce que vous devriez accomplir avec cet exercice :

  1. Créez quatre listes de zones géographiques en Finlande (par exemple, nort_west , north_east , south_west , south_east )
  2. Itérer les valeurs et déterminer à quelle zone géographique appartient la station
    1. Astuce: vous devez créer une boucle qui répète N -nombre de fois. Créez une variable N qui doit contenir le nombre de stations que nous avons ici.
    2. Vous devez utiliser une instruction conditionnelle pour savoir si la coordonnée de latitude d'une station est au nord ou au sud du point central de la Finlande ( 26.3, 64.5 ) ET si la longitude l'emplacement est à l'ouest ou à l'est de ce point central.
    3. Vous devez insérer le nom de la station dans la bonne liste de zones géographiques (étape 1)
  3. Imprimez les noms des stations dans chaque zone géographique

Vous avez couvert le point 1 et trouvé une méthode plus efficace pour accomplir le point 2.1 (bouclage sur les 3 listes). Pour accomplir le point 2.2, regardez les astuces auxquelles j'ai lié au début, en particulier la section Instructions if imbriquées . Si cela ne vous aide pas tout à fait à résoudre ce problème, vous souhaitez revenez au chapitre sur les instructions conditionnelles .

La structure de base de ce que vous voulez faire est la suivante:

north_west = []
north_east = []
south_west = []
south_east = []

N = len(stations)

for i in range(N):
    station = stations[i]
    lat = lats[i]
    lon = lons[i]

    if <<test to see if lon is east of 26.3>>:
        if <<test to see if lat is north of 64.5>>:
            # add station to the north_east list
        else:  # south or at 64.5
            # add station to the south_east list
    else:  # west or at 26.3
        if <<test to see if lat is north of 64.5>>:
            # add station to the north_west list
        else:  # south or at 64.5
            # add station to the south_west list

puis imprimez les noms dans chacune des quatre listes. Notez que j'ai omis les conditions réelles à remplir ici.

Il existe des moyens plus efficaces et `` intelligents '' de réaliser ce qui précède, vous en avez trouvé un, pour i dans l'intervalle (N ): et 3 affectations distinctes peuvent être remplacées par pour station, lat, lon dans zip (....): . Cependant, je m'en tiendrai au modèle ci-dessus pour le moment. J'ai inclus une approche différente ci-dessous, cachée comme un bloc de spoiler afin de ne pas trop vous distraire:

Si vous vouliez être super intelligent, vous pouvez créer un mappage à partir de (booléen, booléen) tuples à ces 4 listes pour sélectionner chaque liste: régions = { # nord?, est? (Faux, Faux): sud_ouest, (Faux, Vrai): sud_est, (Vrai, Faux): nord_ouest, (Vrai, Vrai): nord_est, } pour station, lon, lat in zip (stations, lons, lats): régions [lat> 64,5, lon> 26,3] .append (station) mais c'est certainement au-delà des exigences du cours. :-)


1 commentaires

Merci Martijn J'apprécie vraiment le temps que vous avez pris pour cette réponse! Je pense que j'étais en train de me demander quel code itérerait dans l'index des 3 listes, mais en regardant votre réponse et en parcourant les documents, c'est vraiment très clair. Merci encore!



-1
votes

Vous pouvez utiliser une boucle while pour parcourir toutes ces valeurs de latitude et de longitude, puis vérifier les conditions pour

    stations = ['Hanko Russarö', 'Heinola Asemantaus', 'Helsinki Kaisaniemi', 'Helsinki Malmi airfield', 'Hyvinkää Hyvinkäänkylä', 'Joutsa Savenaho', 'Juuka Niemelä', 'Jyväskylä airport', 'Kaarina Yltöinen', 'Kauhava airfield', 'Kemi Kemi-Tornio airport', 'Kotka Rankki', 'Kouvola Anjala', 'Kouvola Utti airport', 'Kuopio Maaninka', 'Kuusamo airport', 'Lieksa Lampela', 'Mustasaari Valassaaret', 'Parainen Utö', 'Pori airport', 'Rovaniemi Apukka', 'Salo Kärkkä', 'Savonlinna Punkaharju Laukansaari', 'Seinäjoki Pelmaa', 'Siikajoki Ruukki', 'Siilinjärvi Kuopio airport', 'Tohmajärvi Kemie', 'Utsjoki Nuorgam', 'Vaala Pelso', 'Vaasa airport', 'Vesanto Sonkari', 'Vieremä Kaarakkala', 'Vihti Maasoja', 'Ylitornio Meltosjärvi']

    lats = [59.77, 61.2, 60.18, 60.25, 60.6, 61.88, 63.23, 62.4, 60.39, 63.12, 65.78, 60.38, 60.7, 60.9, 63.14, 65.99, 63.32, 63.44, 59.78, 61.47, 66.58, 60.37, 61.8, 62.94, 64.68, 63.01, 62.24, 70.08, 64.5, 63.06, 62.92, 63.84, 60.42, 66.53]

    lons = [22.95, 26.05, 24.94, 25.05, 24.8, 26.09, 29.23, 25.67, 22.55, 23.04, 24.58, 26.96, 26.81, 26.95, 27.31, 29.23, 30.05, 21.07, 21.37, 21.79, 26.01, 23.11, 29.32, 22.49, 25.09, 27.8, 30.35, 27.9, 26.42, 21.75, 26.42, 27.22, 24.4, 24.65]
    i=0
    north_south_cutoff = 64.5
    east_west_cutoff = 26.3
    north_east=[]
    north_west=[]
    south_east=[]
    south_west=[]
    for i in range(0,len(stations)):
            if lats[i]>north_south_cutoff and lons[i]>east_west_cutoff:
                      north_east.append(str(stations[i]))
            elif lats[i]<north_south_cutoff and lons[i]>east_west_cutoff:
                      south_east.append(str(stations[i]))
            elif lats[i]>north_south_cutoff and lons[i]<east_west_cutoff:
                      north_west.append(str(stations[i]))
            elif lats[i]<north_south_cutoff and lons[i]<east_west_cutoff:
                      south_west.append(str(stations[i]))
    print(north_east)
    print(north_west)
    print(south_east)
    print(south_west)

Et puis ajouter le nom de la station à la liste respective.

Ainsi, le code complet, simple et propre ressemblerait à:

NW (lat>NWcutoff&lon<EWcutoff)

NE (lat>NWcutoff&lon>EWcutoff)

SW (lat<NWcutoff&lon<EWcutoff)

SE (lat<NWcutoff&lon>EWcutoff)

Cela mettra toutes les stations dans des listes respectives après avoir comparé les longitudes et les latitudes sur la base du décalage.



0
votes

Le conseil est d'utiliser la fonction intégrée enumerate pour obtenir un index et une valeur (nom de la station) à partir de la première liste. Ensuite, vous utilisez l'index pour obtenir deux autres valeurs (latitude et longitude) et vérifiez ces valeurs pour déterminer à quelle région elles appartiennent. Ajoutez ensuite ce nom à la liste de résultats station_list [quatrant] .append (name)

Voici la solution:

Region: North-West
 1. Kemi Kemi-Tornio airport
 2. Rovaniemi Apukka
 3. Siikajoki Ruukki
 4. Ylitornio Meltosjärvi

Region: North East
 1. Kuusamo airport
 2. Utsjoki Nuorgam

Region: South West
 1. Hanko Russarö
 2. Heinola Asemantaus
 3. Helsinki Kaisaniemi
 4. Helsinki Malmi airfield
 5. Hyvinkää Hyvinkäänkylä
 6. Joutsa Savenaho
 7. Jyväskylä airport
 8. Kaarina Yltöinen
 9. Kauhava airfield
10. Mustasaari Valassaaret
11. Parainen Utö
12. Pori airport
13. Salo Kärkkä
14. Seinäjoki Pelmaa
15. Vaasa airport
16. Vihti Maasoja

Region: South East
 1. Juuka Niemelä
 2. Kotka Rankki
 3. Kouvola Anjala
 4. Kouvola Utti airport
 5. Kuopio Maaninka
 6. Lieksa Lampela
 7. Savonlinna Punkaharju Laukansaari
 8. Siilinjärvi Kuopio airport
 9. Tohmajärvi Kemie
10. Vaala Pelso
11. Vesanto Sonkari
12. Vieremä Kaarakkala

Sortie: p>

# Cutoff values that correspond to the centroid of Finnish mainland
# North - South
north_south_cutoff = 64.5

# East-West
east_west_cutoff = 26.3

# Station names
stations = ['Hanko Russarö', 'Heinola Asemantaus', 'Helsinki Kaisaniemi',
        'Helsinki Malmi airfield', 'Hyvinkää Hyvinkäänkylä', 'Joutsa Savenaho',
        'Juuka Niemelä', 'Jyväskylä airport', 'Kaarina Yltöinen', 'Kauhava airfield',
        'Kemi Kemi-Tornio airport', 'Kotka Rankki', 'Kouvola Anjala',
        'Kouvola Utti airport', 'Kuopio Maaninka', 'Kuusamo airport',
        'Lieksa Lampela', 'Mustasaari Valassaaret', 'Parainen Utö', 'Pori airport',
        'Rovaniemi Apukka', 'Salo Kärkkä', 'Savonlinna Punkaharju Laukansaari',
        'Seinäjoki Pelmaa', 'Siikajoki Ruukki', 'Siilinjärvi Kuopio airport',
        'Tohmajärvi Kemie', 'Utsjoki Nuorgam', 'Vaala Pelso', 'Vaasa airport',
        'Vesanto Sonkari', 'Vieremä Kaarakkala', 'Vihti Maasoja', 'Ylitornio Meltosjärvi']

# Latitude coordinates of Weather stations
lats = [59.77, 61.2, 60.18, 60.25, 60.6, 61.88, 63.23, 62.4,
   60.39, 63.12, 65.78, 60.38, 60.7, 60.9, 63.14, 65.99,
   63.32, 63.44, 59.78, 61.47, 66.58, 60.37, 61.8, 62.94,
   64.68, 63.01, 62.24, 70.08, 64.5, 63.06, 62.92, 63.84,
   60.42, 66.53]

 # Longitude coordinates of Weather stations
lons = [22.95, 26.05, 24.94, 25.05, 24.8, 26.09, 29.23, 25.67,
   22.55, 23.04, 24.58, 26.96, 26.81, 26.95, 27.31, 29.23,
   30.05, 21.07, 21.37, 21.79, 26.01, 23.11, 29.32, 22.49,
   25.09, 27.8, 30.35, 27.9, 26.42, 21.75, 26.42, 27.22,
   24.4, 24.65]

region_name = ['North-West', 'North East', 'South West', 'South East']

NW = 0
NE = 1
SW = 2
SE = 3

def divide_station(stations, lats, lons):
    station_list = [[] for _ in range(SE+1)]
    for index, name in enumerate(stations):
        if lats[index] > north_south_cutoff:
            quatrant = NE if lons[index] > east_west_cutoff else NW
        else:
            quatrant = SE if lons[index] > east_west_cutoff else SW
        station_list[quatrant].append(name)
    return station_list

north_west, north_east, south_west, south_east = divide_station(stations, lats, lons)

station_list = [north_west, north_east, south_west, south_east]

for index, region in enumerate(station_list):
    print('\nRegion:', region_name[index])
    for number, name in enumerate(region):
        print('%2d. %s' % (number+1, name))


0 commentaires