python - Python中的多对多数据结构

标签 python data-structures many-to-many

我有一个多对多关系的书籍和作者数据集。

大约有 10^6 本书和 10^5 位作者,平均每本书有 10 位作者。

我需要对数据集进行一系列的操作,比如统计每个作者的书籍数量,或者从集合中删除某个作者的所有书籍。

允许快速处理的良好数据结构是什么?

我希望有一些现成的模块可以提供以下方法:

obj.books.add(book1)

# linking
obj.books[n].author = author1
obj.authors[m].author = book1

# deleting
obj.remove(author1) # should automatically remove all links to the books by author1, but not the linked books

我应该澄清一下,我不喜欢为此使用数据库,而是在内存中完成这一切。

谢谢

最佳答案

sqlite3 (或任何其他好的关系数据库,但是 sqlite 随 Python 一起提供,并且对于这样一个相当小的数据集更方便)似乎是您任务的正确方法。如果您不想学习 SQL,SQLAlchemy是关系数据库的流行“包装器”,可以这么说,它允许您在您选择的几个不同抽象级别中的任何一个处理它们。

而且“在内存中完成”完全没有问题(请注意,这愚蠢,因为您将不必要地付出从每个更持久的地方读取所有数据的开销以及程序的每次运行,同时将数据库保存在磁盘文件上会节省您的开销——但是,这是一个不同的问题;-)。只需将您的 sqlite 数据库打开为 ':memory:' 就可以了——一个全新的关系数据库完全存在于内存中(仅在您的进程期间),过程中不涉及磁盘完全。那么,为什么不呢?-)

就我个人而言,我会直接使用 SQL 来完成这项任务——它让我可以很好地控制正在发生的事情,并且可以轻松地让我添加或删除索引以调整性能等。您将使用三个表:a Books表(主键ID,其他字段如Title&c),一张Authors表(主键ID,其他字段如Name&c),一个“many-to” - 许多关系表”,比如 BookAuthors,只有两个字段,BookIDAuthorID,每个作者-书籍连接一条记录。

BookAuthors 表的两个字段是所谓的“外键”,分别指 Books 和 Authors 的 ID 字段,您可以使用 ON DELETE CASCADE 定义它们 以便引用被删除的书籍或作者的记录依次自动删除——这是一个高语义级别的例子,即使是“裸”SQL 也可以让你工作,这是任何其他现有数据结构都无法比拟的匹配。

关于python - Python中的多对多数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3538322/

相关文章:

c++ - Rapidjson::Type 的切换大小写

ember.js - 与 Ember、ember-data 和 Rails 的多对多关系

laravel - 访问和显示数据透视表数据

php - MySQL 多对多具有唯一键和更新/选择如果存在否则插入

python - python中的位移位

python - 捕食者与猎物的Python程序

algorithm - 使用旋转的二叉树变换

python - 给定两个字符串列表,如何将它们转换为字典?

java - 用于 Android 应用程序的 Python

python - tabula.exe 路径未在 pyqt5 中打开