在两个列表中匹配子字符串并提取对应键值对的技术求助
嘿,我来帮你搞定这个问题!你遇到的TypeError: expected string or buffer大概率是因为nameList里混入了非字符串类型的元素(比如数字、None或者其他对象),而你用了需要处理字符串的方法(比如正则匹配)去操作这些元素,才触发了这个错误。
下面给你两种靠谱的解决方案,直接就能用:
方法1:基础子串匹配(简单高效)
这种方法用Python原生的in操作符判断子串,同时先检查元素类型,避免报错:
# 示例输入 nameList = ['abc-1', 'def-3', 'abc-2', 'ghi-4'] statusList = ['ok', 'error', 'ok', 'pending'] target_sub = 'abc' finalNameList = [] finalStatusList = [] # 用zip把两个列表的对应元素配对遍历 for name, status in zip(nameList, statusList): # 先确保当前name是字符串,再判断是否包含目标子串 if isinstance(name, str) and target_sub in name: finalNameList.append(name) finalStatusList.append(status) # 输出结果 print(finalNameList) # ['abc-1', 'abc-2'] print(finalStatusList) # ['ok', 'ok']
方法2:正则匹配(适合复杂匹配规则)
如果你需要更复杂的匹配逻辑(比如匹配特定格式的子串),可以用正则,但一定要先检查元素类型:
import re # 示例输入(故意混入非字符串元素模拟报错场景) nameList = ['abc-1', 'def-3', 'abc-2', 123, None, 'ghi-4'] statusList = ['ok', 'error', 'ok', 'invalid', 'null', 'pending'] # 编译正则模式,提升匹配效率 target_pattern = re.compile(r'abc') finalNameList = [] finalStatusList = [] for name, status in zip(nameList, statusList): # 先过滤非字符串元素,再用正则匹配 if isinstance(name, str) and target_pattern.search(name): finalNameList.append(name) finalStatusList.append(status) # 输出结果 print(finalNameList) # ['abc-1', 'abc-2'] print(finalStatusList) # ['ok', 'ok']
额外提醒
- 确保
nameList和statusList的长度一致,zip会以较短的列表为准,长度不一致会导致部分元素被忽略。 - 如果你的
nameList里确定全是字符串,那可以去掉isinstance(name, str)的检查,简化代码。
内容的提问来源于stack exchange,提问作者jeff
相关产品推荐
相关产品推荐

