Python: как перебрать 3 списка - PullRequest
1 голос
/ 09 марта 2019

Выполняю курс в свое время под названием GeoPython 2018 и сильно застрял на уроке 3, упражнении 3.

Контент до сих пор представлял собой условные операторы, циклы и списки (без словарей).

ПРОБЛЕМА :

Нас просят взять список названий метеостанций, список широт и список долгот и разделить их на 4 региона (NE, NW, SE, SW), определенных срезами.

# 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

Конечным результатом является заполнение следующих списков названиями станций, которые назначены правильно:

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

Я занимался этим, может быть, 3-4 часа без прогресса, пытался использовать словари

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

Но дальше идти не буду, кроме того, у меня складывается впечатление, что организаторы курса хотят, чтобы люди сосредоточились на итерациях и условных выражениях.

Любой совет или толчок в направлении был бы полезен. Это также мой первый пост, поэтому прошу прощения, если нет ясности.

Ответы [ 4 ]

0 голосов
/ 09 марта 2019

Рекомендуется использовать встроенную функцию enumerate , чтобы получить индекс и значение (название станции) из первого списка.Затем вы используете индекс для получения еще двух значений (широта и долгота) и проверяете эти значения, чтобы определить, к какому региону они относятся.Затем добавьте это имя в список результатов station_list [quatrant] .append (имя)

Вот решение:

# 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))

Вывод:

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
0 голосов
/ 09 марта 2019

Курс, который вы читаете, довольно щедрый с подсказками , и он включает инструкции о том, что вы должны выполнить с этим упражнением :

  1. Создайте четыре списка для географических зон в Финляндии (например, nort_west, north_east, south_west, south_east)
  2. Переберите значения и определите, к какой географической зоне принадлежит станция
    1. Подсказка: вы должны создать цикл, который повторяет число N раз.Создайте переменную N, которая должна содержать количество станций, которые у нас есть.
    2. Вы должны использовать условный оператор, чтобы выяснить, является ли координата широты станции севером или югомцентральной точки Финляндии (26.3, 64.5) И , если долгота расположена к западу или востоку от этой центральной точки.
    3. Вы должны вставить название станции в правильную географическую зонуlist (шаг 1)
  3. Распечатайте названия станций в каждой географической зоне

Вы рассмотрели пункт 1 и нашли более эффективный методчтобы выполнить пункт 2.1 (цикл по 3 спискам).Чтобы выполнить пункт 2.2, посмотрите на те подсказки, на которые я ссылался в начале, а именно на раздел Nested if Statement .Если это не совсем помогает вам решить эту проблему, вы хотите повторно достичь условных выражений chapter .

Базовая структура того, что вы хотите сделатьэто:

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

, затем напечатайте имена в каждом из четырех списков.Обратите внимание, что я не учел фактические условия, которые вы должны заполнять здесь.

Существуют более эффективные и «умные» способы достижения вышесказанного, вы нашли один, когда for i in range(N): и 3 отдельных задания можно заменитьна for station, lat, lon in zip(....):.Тем не менее, я бы придерживался вышеупомянутой картины пока.Ниже я включил другой подход, скрытый как спойлер, чтобы не слишком отвлекать вас:

0 голосов
/ 09 марта 2019

Вы можете использовать цикл while для итерации всех этих значений широты и долготы, а затем проверять условия для

NW (lat>NWcutoff&lon<EWcutoff)

NE (lat>NWcutoff&lon>EWcutoff)

SW (lat<NWcutoff&lon<EWcutoff)

SE (lat<NWcutoff&lon>EWcutoff)

И затем добавление названия станции в соответствующий список.

Итак, полный, простой и понятный код будет выглядеть так:

    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)

Это позволит поместить все станции в соответствующие списки после сравнения долготы и широты на основе смещения.

0 голосов
/ 09 марта 2019

Вот один из них (извинения, если запад ниже долготы, затем переключитесь> на <): </p>

north_west = [ a["station"] for a in data if a["latitude"] > north_south_cutoff and a["longitude"] > east_west_cutoff ]
...