首页 > 编程问答 >用于匹配两个数据列表中的项目的高效数据结构 - python

用于匹配两个数据列表中的项目的高效数据结构 - python

时间:2024-07-21 01:55:12浏览次数:13  
标签:python data-structures

我有两个列表,其中一个列表填充 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

相关文章

  • 有人可以解决我的代码中的问题吗?而且我无法在我的电脑上安装 nsetools。如何在 python
    从nsetools导入Nseimportpandasaspdnse=Nse()all_stock_codes=nse.get_stock_codes()companies_with_low_pe=[]对于all_stock_codes中的代码:如果代码=='符号':继续尝试:stock_quote=nse.get_quote(代码)pe_ratio=stock_quote.get('priceT......
  • 将 python 脚本的 stdin 重定向到 fifo 会导致 RuntimeError: input():lost sys.stdin
    我有这个python脚本,它的作用是充当服务器,它从重定向到fifo的stdin读取命令:test.py:whileTrue:try:line=input()exceptEOFError:breakprint(f'Received:{line}')在bash中运行命令:mkfifotestfifotest.py<testfifo......
  • Python/Flask mysql 游标:为什么它不起作用?
    fromflaskimportFlaskfromflask_mysqldbimportMySQLapp=Flask(__name__)app.config['MYSQL_HOST']='localhost'app.config['MYSQL_USER']='root'app.config['MYSQL_PASSWORD']='password'a......
  • Python pandas to_csv 导致 OSError: [Errno 22] 参数无效
    我的代码如下:importpandasaspdimportnumpyasnpdf=pd.read_csv("path/to/my/infile.csv")df=df.sort_values(['distance','time'])df.to_csv("path/to/my/outfile.csv")此代码成功从infile.csv(一个3GBcsv文件)读取数据,对其进行排......
  • 从 python 中的字符串列表中提取 def 定义函数的标签
    我想使用Python中的正常def过程创建函数,并将标签分配给从字符串列表中提取的命名空间。如何实现这一点?这个问题的动机:我正在创建一个与sympy兼容的python函数库,供数学家用于符号计算实验。许多函数需要初始化具有相关标签的多个对象的系统,这些标签分别由用户提供的字......
  • 在 Raspberry Pi 4 上使用 Python 从具有 SPI 连接的 MT6816 磁性编码器读取
    我对这个领域完全陌生,并不真正知道自己在做什么并且需要帮助。我正在尝试使用MT681614位磁性编码器通过RaspberryPi的SPI连接读取绝对角度。我有以下问题:在硬件方面,是否只是简单地连接必要的连接(3.3V、MOSI、MISO、SCK、GND、CE01)?对于编码......
  • PythonW 不运行脚本。严重地
    因此,使用Windows10和Python3.6。我创建了一个.py脚本,它可以使用命令pythonmyscript.py在命令提示符下正常运行,但是当我制作该脚本的精确副本并为其赋予扩展名.pyw,并尝试使用pythonw运行它时命令pythonwmyscript.pyw,什么也没有发生......
  • 如何使用Python和Selenium模拟产品购买以获取库存信息
    我正在开发一项网络抓取服务,主要针对时尚行业。我的目标是提供有关产品的全面数据,包括库存水平。为了实现这一目标,我需要模拟购买以确定每种尺寸的产品的最大可用数量。我一直在使用Python和Selenium进行网络抓取部分,但在准确模拟购买方面面临着挑战检索股票信息的过程。......
  • 连接Python套接字的问题
    当我写“关闭”时,我试图让我的电报机器人关闭计算机。我不想将机器人连接到网站上的托管。我选择我的手机(AndroidRedmiNote10)作为托管。我在上面安装了Termux和Pydroid。我写了两个文件:main到我的电脑,client到我的手机。通过在计算机上运行这两个文件,一切正常。但是,当我在......
  • 如何修复导入 Numexpr Python 时的错误
    在Windows10Python3.7.9(IDLE)上,我成功安装了“pipinstallnumexpr”,但在“importnumexprasne”时出现错误:Traceback(最近一次调用):文件“<pyshell#21>”,第267行,位于将numexpr导入为ne文件“C:\Python379\lib\site-packages\numexpr_init_.py”......