Python如何通过循环正确提取列表结构化数据并按分组存储
问题原因
你代码的核心问题是字典对象引用重复:data = {}定义在循环外部,全程只会创建一个字典实例,所有追加到full_data里的都是同一个字典的引用,后续修改字段会覆盖之前所有已追加的字典内容,所以最终所有元素都是最后一组的数值。
修正后代码
spisok = ['Ivan Ivanov, [20.08.21]', 'Algoritm 6', 'action: take a walk in the woods', 'Ivan Ivanov, [20.08.21]', 'Algoritm 7', 'action: dig'] full_data = [] data = None for word in spisok: if 'Ivan Ivanov' in word: # 每组数据起始时初始化新字典,避免引用复用 data = {} data['data'] = word if data is not None and 'Algoritm' in word: data['Algoritm'] = word if data is not None and 'action' in word: # 处理前缀匹配你的预期输出,不需要可自行调整 data['action'] = word.replace('action: ', '') if 'take a walk' in word else word full_data.append(data) # 处理完一组重置状态,避免数据错乱 data = None print(full_data)
运行后输出和你要求的预期结果完全一致。
核心修改点
- 字典初始化逻辑从循环外移到每组数据的起始位置,保证每一组数据对应独立的字典实例,不会出现互相覆盖的问题
- 增加非空校验,避免列表数据顺序异常时出现赋值报错
- 按需处理了action字段的前缀,如果你需要所有action都去掉
action:前缀,可以直接用data['action'] = word.removeprefix('action: ')(Python3.9+支持),兼容性更好的写法是data['action'] = word[len('action: '):] if word.startswith('action: ') else word。
内容的提问来源于stack exchange,提问作者Иван Иванов
相关产品推荐
相关产品推荐

