Пока и для циклов по спискам - PullRequest
0 голосов
/ 13 декабря 2018

У меня есть этот код, который в настоящий момент запускает циклы for для одного списка

data3 = []
x=0 
while x<len(river_df_list):
    for line in river_df_list[x]: 
        try: 
            distance = haversine(river_df_list[x][0],river_df_list[x][1],df1_list[0][4],df1_list[0][3])
            data3.append(distance)
            x=x+1
        except IndexError:
            pass

df1_list[0].append(data3.index(min(data3)))  

Где функция haversine:

def haversine(lon1, lat1, lon2, lat2):
    """
    Calculate the great circle distance between two points 
    on the earth (specified in decimal degrees)
    """
    # convert decimal degrees to radians 
    lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2])

# haversine formula 
dlon = lon2 - lon1 
dlat = lat2 - lat1 
a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2
c = 2 * asin(sqrt(a)) 
r = 6371 # Radius of earth in kilometers. Use 3956 for miles
return c * r

river_df_list (сокращенный) выглядит так:

[[151.7753278, -32.90526725, 'HUNTER RIVER']
[151.77526830000002, -32.90610052, 'HUNTER RIVER']
[151.775397, -32.90977754, 'HUNTER RIVER']
[151.775578, -32.91202941, 'HUNTER RIVER']
[151.77586340000002, -32.91508789, 'HUNTER RIVER']
[151.7764116, -32.91645856, 'HUNTER RIVER']
[151.7773432, -32.91905274, 'HUNTER RIVER']
[151.7784225, -32.91996844, 'HUNTER RIVER']
[151.780565, -32.92181352, 'HUNTER RIVER']
[151.7807739, -32.92183623, 'HUNTER RIVER']
[151.78591709999998, -32.92187872, 'HUNTER RIVER']]

df1_list (сокращенно) выглядит следующим образом:

[[5, 'A69-1601-27466', 'Golden perch', -35.495479100000004, 144.45295380000002, '14/08/2015']
[6, 'A69-1601-27466', 'Golden perch', -35.495479100000004, 144.45295380000002, '15/08/2015']
[7, 'A69-1601-27466', 'Golden perch', -35.495479100000004, 144.45295380000002, '16/08/2015']
[8, 'A69-1601-27466', 'Golden perch', -35.5065473, 144.4488804, '17/08/2015']]

В настоящее время, когда я запускаю код сверху, я могу циклически проходить по river_df_list и применять функцию haversine для первой точки в df1_list.,В конце код добавляет индекс, где минимальное значение в data3 произошло в df1_list, так что теперь он выглядит следующим образом:

[5, 'A69-1601-27466', 'Golden perch', -35.495479100000004, 144.45295380000002, '14/08/2015',324110 ]
[6, 'A69-1601-27466', 'Golden perch', -35.495479100000004, 144.45295380000002, '15/08/2015']
[7, 'A69-1601-27466', 'Golden perch', -35.495479100000004, 144.45295380000002, '16/08/2015']
[8, 'A69-1601-27466', 'Golden perch', -35.5065473, 144.4488804, '17/08/2015']

Что я хочу сделать, это изменить цикл while / for наtop, чтобы сравнить все точки river_df_list в каждой точке df1_list и добавить индекс в конец df1_list, чтобы в итоге получить желаемый результат:

[[5, 'A69-1601-27466', 'Golden perch', -35.495479100000004, 144.45295380000002, '14/08/2015',324110 ]
[6, 'A69-1601-27466', 'Golden perch', -35.495479100000004, 144.45295380000002, '15/08/2015',32440]
[7, 'A69-1601-27466', 'Golden perch', -35.495479100000004, 144.45295380000002, '16/08/2015',31110]
[8, 'A69-1601-27466', 'Golden perch', -35.5065473, 144.4488804, '17/08/2015',35479]]

Как мне поступить так?

1 Ответ

0 голосов
/ 13 декабря 2018

Это должно работать:

for x in df1_list:
    data3 = []
    for y in river_df_list:
        distance = haversine(y[0],y[1],x[4],x[3])
        data3.append(distance)
    x.append(data3.index(min(data3)))

Поскольку вам нужно, чтобы каждая точка относилась к любой другой точке, вы используете вложенный цикл и работаете через оба.Для каждого массива в df1 вы просматриваете весь файл river_df, получаете хаверсайны и сохраняете их в data3.Затем вы получаете минимум из data3 и добавляете его в этот массив, а затем переходите к следующему массиву в df1.Он работает с данными игрушки, которые вы дали.

Редактировать: Кроме того, data3 кажется довольно дорогим (как по времени, так и по памяти) и ненужным, если вы действительно хотите индекс минимума.Это устранило бы это:

from sys import maxsize

for x in df1_list:
    min_distance = [maxsize, 0]
    for i, y in enumerate(river_df_list):
        distance = haversine(y[0],y[1],x[4],x[3])
        if distance < min_distance[0]:
            min_distance = [distance, i]
    x.append(min_distance[1])

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

...