首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >列表上的While和for循环

列表上的While和for循环
EN

Stack Overflow用户
提问于 2018-12-13 07:20:35
回答 1查看 58关注 0票数 2

我有以下代码,它当前对一个列表运行for循环

代码语言:javascript
复制
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函数是:

代码语言:javascript
复制
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 (缩写)如下所示:

代码语言:javascript
复制
[[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 (缩写)如下所示:

代码语言:javascript
复制
[[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并对df1_list中的第一个点应用半正弦函数。最后,代码将data3中出现最小值的索引附加到df1_list中,因此它现在看起来如下所示:

代码语言:javascript
复制
[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循环,以比较df1_list的每个点上的所有river_df_list点,并将索引附加到df1_list的末尾,因此,最终所需的输出将是:

代码语言:javascript
复制
[[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]]

我该怎么做呢?

EN

回答 1

Stack Overflow用户

发布于 2018-12-13 11:11:48

这应该是可行的:

代码语言:javascript
复制
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中。然后,在进入df1中的下一个数组之前,您将从data3获取最小值并将其附加到该数组上。它正在处理你给出的玩具数据。

编辑:此外,data3看起来非常昂贵(在时间和内存上),而且没有必要,因为你只想要最小的索引。这将消除它:

代码语言:javascript
复制
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,你可以直接使用它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53752888

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档