双重循环引发无限循环问题:CSV邮政编码匹配经纬度代码排查
搞定你的Python邮编匹配无限循环问题
嘿,我来帮你排查并解决这个无限循环的坑!
一、无限循环的直接元凶
从你贴的代码片段能明显看到,内层循环的range(0, le...是没写完的拼写错误——应该是len(X)但你漏写了后面的字符。这种错误会导致循环条件失效:要么语法报错,要么如果误写了一个永远满足的条件(比如不小心写成了range(0, 1000000)这种超大数),直接让内层循环停不下来,进而触发无限循环。
二、两种解决方案,推荐第二种!
方案1:先把循环修对(应急用)
如果非要用循环,先把拼写错误改了,再加上匹配后的终止逻辑,避免无效遍历:
import numpy as np from math import radians, sqrt, sin, cos, atan2 import pandas as pd # 读取数据 df = pd.read_csv("C:/Users///UKPostcodes.csv") df1 = pd.read_csv("C:/Users///postcode.csv") # 提取需要的列值 X = df['outcode'].values lat = df['latitude'].values lon = df['longitude'].values find = df1['Postcode District'].values longitude = [] latitude = [] # 顺便把纬度也存上 for i in range(len(find)): target_postcode = find[i] matched = False # 修正内层循环的len(X)拼写 for j in range(len(X)): if X[j] == target_postcode: longitude.append(lon[j]) latitude.append(lat[j]) matched = True break # 找到匹配就立刻跳出内层循环,别白跑剩下的 # 处理匹配不到的情况,避免列表长度不一致 if not matched: longitude.append(np.nan) latitude.append(np.nan) # 把结果合并回原数据框 df1['longitude'] = longitude df1['latitude'] = latitude
方案2:用Pandas原生merge(强烈推荐,高效又省心)
双重循环在数据量大的时候慢得离谱,Pandas自带的merge方法专门干这种按列匹配的活儿,一行代码搞定所有:
import pandas as pd df = pd.read_csv("C:/Users///UKPostcodes.csv") df1 = pd.read_csv("C:/Users///postcode.csv") # 按邮编列合并,保留df1的所有行,匹配不到的自动填NaN result_df = pd.merge(df1, df, left_on='Postcode District', right_on='outcode', how='left') # 看看结果 print(result_df.head())
这个方法不仅不会有循环的各种坑,还自动处理了匹配失败的情况,性能比循环好几个量级,完全没必要自己写双重循环折腾。
为啥双重循环容易踩坑?
- 拼写错误很容易导致循环条件崩掉(就像你这次的情况)
- 数据多的时候,双重循环的时间复杂度是O(n*m),跑起来巨慢
- 手动处理匹配失败、重复值这些细节很容易出错
内容的提问来源于stack exchange,提问作者dudearb
相关产品推荐
相关产品推荐

