我有两个列表,其中一个列表填充 ID,另一个列表填充进程名称。多个进程名称可以共享一个 ID。
我希望能够创建一个可以使用特定 ID 的数据结构,然后返回与该 ID 关联的进程列表。我还希望能够使用特定的进程名称并返回与其连接的 ID 列表。
我知道我可以为此创建一个字典,但是 ID 列表将非常大并且会继续增长,但是进程名称将相当短(最有可能少于 20 个字符)并且不会增长那么多。我不确定从长远来看字典的效率如何。
我希望能够在我的计算机上本地存储两个列表之间的连接,以便我可以将它们重新加载到我的程序中,为新的添加新连接ID 的。
| ID's | Process |
| -------- | -------- |
| ID 1 | Process 1|
| ID 2 | Process 2|
... ...
这两个列表是沿着这些思路的,但 ID 的列表要大得多。
我尝试将其想象为考试中的匹配部分,其中有两列,我们必须连接每列中的项目到另一个。多个项目可以共享同一个连接。我用两个字典实现了这一点,这两个字典建立了“A 列”和“B 列”之间的关系(其中 A 是 ID,B 是进程名称)。该结构运行良好,但我不确定它对于快速增长的 A 列是否有效,并且我不确定如何有效地将数据存储在我的 PC 上。我想知道这个结构是否可以改进,或者是否有另一种结构会更好。
听起来你正在描述一个多对多的关系,并且你希望能够从任何一方有效地查询该关系。虽然字典可以用来表示这一点,但是对于你正在处理的数据量以及你想要实现的持久性来说,可能会有更优化的结构和方法。
1. 使用
defaultdict
进行反向查找
你可以使用 Python 的
collections
模块中的
defaultdict
来有效地表示这种关系。这将允许你在两个方向(id 到进程和进程到 id)进行快速查找:
from collections import defaultdict
def build_id_to_processes_mapping(ids, processes):
"""
构建从 id 到进程列表的映射。
"""
mapping = defaultdict(set)
for id, process in zip(ids, processes):
mapping[id].add(process)
return mapping
# 示例用法
ids = ['ID 1', 'ID 2', 'ID 1', 'ID 3', 'ID 2']
processes = ['Process 1', 'Process 2', 'Process 3', 'Process 4', 'Process 2']
id_to_processes = build_id_to_processes_mapping(ids, processes)
print(f"id_to_processes: {id_to_processes}")
# 输出:id_to_processes: defaultdict(<class 'set'>, {'ID 1': {'Process 1', 'Process 3'}, 'ID 2': {'Process 2'}, 'ID 3': {'Process 4'}})
# 查询
print(f"ID 1 的进程:{id_to_processes.get('ID 1')}") # 输出:ID 1 的进程:{'Process 1', 'Process 3'}
2. 持久化
要将此映射持久化到你的计算机上,你可以使用各种序列化方法。其中两种流行的选择是:
- Pickle: Pickle 是 Python 对象序列化的内置模块。它很容易使用,但可能不适合非常大的数据集。
```python import pickle
# 存储映射 with open('id_to_processes.pickle', 'wb') as f: pickle.dump(id_to_processes, f)
# 加载映射 with open('id_to_processes.pickle', 'rb') as f: loaded_mapping = pickle.load(f) ```
- 数据库: 对于非常大的数据集或需要更多查询灵活性的情况,请考虑使用像 SQLite 这样的轻量级数据库。
```python import sqlite3
# 创建一个数据库和一个表 conn = sqlite3.connect('my_data.db') cursor = conn.cursor() cursor.execute('''CREATE TABLE IF NOT EXISTS id_processes (id TEXT NOT NULL, process TEXT NOT NULL)''')
# 插入数据 for id, process_set in id_to_processes.items(): for process in process_set: cursor.execute("INSERT INTO id_processes VALUES (?, ?)", (id, process)) conn.commit()
# 查询数据 cursor.execute("SELECT process FROM id_processes WHERE id=?", ('ID 1',)) processes = cursor.fetchall() print(processes)
conn.close() ```
选择正确的方法
-
如果你的数据集相对较小,并且你主要关心 Python 中的性能,则
defaultdict
方法以及pickle
用于持久化将是一个不错的选择。 - 如果你的数据集非常大,或者你需要更高级的数据库功能(例如,用于更复杂查询的索引或其他数据完整性功能),则使用数据库将会更合适。
请记住根据你的特定需求和约束条件对这些选项进行基准测试,以确定最有效的方法。
标签:python,data-structures From: 78769765