如何在列表中关联11位ID与对应Material信息(优化判断逻辑)
问题:提取Material行对应的11位关联ID
原始数据列表
mylist = [' 12345678912 ST', ' Halterung für Fortlüfterhaube', ' Material/Werkstoff: Metall-Lackiert', ' **Beginn Zeichnung**', ' 98765432164 ST', ' Klappe, komplett', ' **Beginn Zeichnung**', ' 74563254671 ST', ' Sieb Außen-Dm 145 x 0,8mm', ' Versatz Dm 122 x 5mm tief', ' Material: Niro 1.4301 - Lochblech Dm1/LA1,5mm', ' 90876487921 M', ' Gista-Profil', ' mit Moosgummihohlkammer-Dichtung (EPDM)', ' Farbe: schwarz, Klemmbereich: 1-2 mm', ' Material: EPDM, 60 +/- 5 Shore A,', ' 64352647971 ST', ' Winkelblech für Frost Erdungskontakt (AB 434 l)', ' für TGr. 78.2', ' Winkelblech für Frost Erdungskontakt (AB 434 l)', ' für TGr. 78.2', ' für TGr. 78.2', ' Material/Werkstoff: X5CrNi 1810']
原始实现代码
Materials = [] iteration_list = mylist for item in iteration_list: if str(item).strip().startswith("Material"): material_index = iteration_list.index(item) ID = "".join(re.findall(r'\d+', str(iteration_list[material_index - 1]))) if len(ID) != 11: ID = "".join(re.findall(r'\d+', str(iteration_list[material_index - 2]))) if len(ID) != 11: ID = "".join(re.findall(r'\d+', str(iteration_list[material_index - 3]))) Materials.extend([ID, item])
原始输出
['12345678912', ' Material/Werkstoff: Metall-Lackiert', '74563254671', ' Material: Niro 1.4301 - Lochblech Dm1/LA1,5mm', '90876487921', ' Material: EPDM, 60 +/- 5 Shore A,', '64352647971', ' Material/Werkstoff: X5CrNi 1810']
核心痛点
当前逻辑通过Material行向上遍历查找11位ID,需要多层if判断适配不同位置,代码冗余且不灵活,希望找到无需大量判断的方式直接定位Material行上方对应的11位ID。
解决方案:跟踪最近的11位ID
实现思路
遍历列表时,实时记录最近出现的11位ID,当遇到Material行时,直接使用这个最近记录的ID,无需向上回溯查找。这种方式不管Material行在ID下方的哪个位置,都能准确关联到对应的ID。
优化后代码
import re Materials = [] current_id = None for item in mylist: # 提取当前行的数字部分并判断是否为11位ID digits = re.findall(r'\d+', item.strip()) if digits and len(digits[0]) == 11: current_id = digits[0] # 遇到Material行时,关联最近记录的ID elif item.strip().startswith("Material") and current_id is not None: # 可按需选择是否strip()清理多余空格 Materials.extend([current_id, item.strip()]) print(Materials)
输出结果
['12345678912', 'Material/Werkstoff: Metall-Lackiert', '74563254671', 'Material: Niro 1.4301 - Lochblech Dm1/LA1,5mm', '90876487921', 'Material: EPDM, 60 +/- 5 Shore A,', '64352647971', 'Material/Werkstoff: X5CrNi 1810']
优势说明
- 无需多层
if判断,代码逻辑简洁清晰 - 仅遍历一次列表即可完成关联,时间复杂度为O(n),效率更高
- 适配任意位置的Material行,只要它在某个11位ID之后,就能准确关联
内容的提问来源于stack exchange,提问作者Sergei
相关产品推荐
相关产品推荐

