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

Python中跨文件列表字符串比较及循环迭代问题排查

解决你的循环迭代与字符串匹配问题

看起来你的程序卡在循环里出不来,而且字符串匹配逻辑也有问题,我帮你拆解一下问题所在,再给出修复方案:

问题1:无限循环导致程序停滞

你的嵌套while循环逻辑有严重问题:

  • 首先变量i没有初始化(代码里没看到i=0的定义),不过更致命的是两个循环共享同一个i变量。当内层循环把i增加到等于len(solu)后,外层循环的条件i < len(dgu)如果还成立(比如solu比dgu短),就会进入外层循环,但内层循环的条件i < len(solu)已经不满足,所以内层循环不会执行,同时外层循环里没有任何改变i的代码,导致外层循环无限运行,程序自然就停滞了。

问题2:大小写不匹配导致无法正确比较

solu里的元素是小写的(来自namo = [x.lower() for x in nam]和bato的交集),但dgu里的Name是原始大小写的字符串。直接用solu[i] in dgu[i]是匹配不到的,因为"apple"和"Apple"是不同的字符串。

修复方案

我重新调整了你的代码逻辑,用更清晰的for循环替代容易出错的while,同时修复大小写匹配问题,还优化了查找效率:

from pandas import ExcelFile
import pandas as pd

# 读取数据
xlsx = ExcelFile('WrongSpelling.xlsx')
df = xlsx.parse(xlsx.sheet_names[0])
dg = pd.read_csv("pfm.csv", usecols=['Place Id','Name','Category'])

# 处理拼写列表,转小写
bat = df['Spelling'].values.tolist()
bato = [x.lower() for x in bat]

# 处理dgu数据,转小写方便匹配,同时保留原始数据
dg['Name_lower'] = dg['Name'].str.lower()
# 找出dgu中Name小写后存在于bato中的条目
matched_rows = dg[dg['Name_lower'].isin(bato)]

# 输出结果
print("匹配到的条目:")
print(matched_rows)
print("\n匹配数量:", len(matched_rows))

如果一定要用手动循环的方式(比如你需要自定义匹配逻辑),可以这样写:

# 先把solu转成集合,方便快速查找
solu_set = set(solu)
# 遍历dgu的每一行
for row in dgu:
    # 把当前行的Name转小写,判断是否在solu里
    name_lower = row[1].lower()
    if name_lower in solu_set:
        print(row)

为什么这样改?

  • 用pandas的内置方法isin比手动循环效率高得多,尤其是数据量大的时候。
  • 统一转成小写后再比较,避免大小写差异导致的匹配失败。
  • 用for循环遍历每一行,逻辑更清晰,不会出现无限循环的问题。
  • 用集合存储solu可以把查找时间从O(n)降到O(1),大幅提升效率。

内容的提问来源于stack exchange,提问作者Abhay

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:35:34