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
相关产品推荐
相关产品推荐

