You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

双重循环引发无限循环问题: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:08:06