Pandas按结果长度重复公司名填充列时出现单字符拆分异常
异常根因
两种错误写法的本质都是没摸透Python内置类型的运算规则:
- 写
z = [y for y in x*len(b)]时,字符串x做乘法x*len(b)的结果是把x的内容重复拼接成一个长字符串,比如x是"comp1"、len(b)=3时,结果是"comp1comp1comp1",遍历这个长字符串自然会把每个单字符拆成列表元素,最终导致Input列出现单字符值。 - 改写成
z = [y for y in [x*len(b)]]时,你把拼好的长字符串整个塞成列表的唯一元素,遍历下来z只有1个元素,完全匹配不上a、b的长度,没法逐行打包。
修正方案
不需要绕列表推导式的弯,直接生成和b长度一致、每个元素都是当前搜索关键词x的序列即可,两种等价的正确写法二选一就行:
- 列表直接乘法:
z = [x] * len(b),把装着单个x的列表重复对应次数,生成的列表每个元素都是独立的x,长度刚好匹配len(b) - 占位符循环生成:
z = [x for _ in range(len(b))],循环len(b)次,每次都把x作为列表元素,因为不需要用到循环的索引值,用下划线当占位符即可。
原代码修正位置
- 原代码里清洗b列表的循环变量和要生成的z序列重名(就是
b = [' '.join(z.split()) for z in b]这行的循环临时变量z),虽然Python列表推导式的作用域不会溢出、不会直接报错,但很容易造成变量名混淆,建议把循环临时变量改成不冲突的命名,比如换成item。 - 把原来生成z的那一行,替换成上述任意正确写法即可,对应修正后的代码片段:
# 修正清洗b的变量名冲突 b = [' '.join(item.split()) for item in b] # 替换原来的错误生成z的代码 z = [x] * len(b) c = [list(pair) for pair in zip(a, b, z)] final_list.extend(c)
替换后遍历搜索"comp1"返回3条企业结果时,z会生成['comp1', 'comp1', 'comp1'],和a、b用zip逐行匹配后,每一条企业结果都会正确标注对应的搜索来源关键词,完全符合预期输出。
内容的提问来源于stack exchange,提问作者Steven
相关产品推荐
相关产品推荐

