Python数据存储选型:字典嵌列表/列表嵌字典/Pandas DataFrame
三种存储方式的适配性分析
你的核心需求是:逐行校验新数据是否已存在,不存在则添加并处理。结合这个场景,三种方式的优劣如下:
1. 字典内嵌列表(按列存储)
这种结构完全不适合你的需求:
- 检查行是否存在时,需要遍历所有索引,把各列对应位置的元素拼接成字典再对比,操作繁琐且效率极低
- 添加新行时,要给每个列的列表分别append对应值,无法像整行操作那样便捷
- 完全不符合你代码里
row in data的直观逻辑
2. 列表内嵌字典(按行存储)
这是最贴合你场景的选择:
- 直接符合你代码里的逻辑:
if row in data可以直接校验行是否存在(Python3.7+字典有序,若担心键顺序问题,可提前把现有行转成排序后的键值对元组集合,比如existing_rows = set(tuple(sorted(row.items())) for row in data),查找效率从O(n)降到O(1)) - 添加新行只需调用
data.append(row),操作简单直接 - 处理行时直接操作字典对象,无需额外转换,代码可读性高
示例优化后的逻辑:
data = [ {"points": 16, "sport": "Football", "team": "Cincinnati Bengals"}, {"points": 2, "sport": "Baseball", "team": "New York Yankees"} ] # 提前构建查找集合优化效率 existing_rows = set(tuple(sorted(row.items())) for row in data) new_data = get_new_data(x,y,z) for row in new_data: row_key = tuple(sorted(row.items())) if row_key not in existing_rows: data.append(row) existing_rows.add(row_key) # 处理该行的逻辑
3. Pandas DataFrame
这种方式属于大材小用,适配性差:
- 校验行是否存在的写法繁琐,需要用
df.isin(row).all(axis=1).any()这类不直观的代码 - 添加行时(无论是
append还是pd.concat)都会生成新的DataFrame,小数据量下效率极低 - 处理行时需要从DataFrame中提取行数据并转换为字典,额外增加代码复杂度
内容的提问来源于stack exchange,提问作者ejn
相关产品推荐
相关产品推荐

