Python 创建字典键的更好方法

Python 创建字典键的更好方法,python,Python,我有一个需要存储在字典中的对象列表。这些对象的一个属性是title,这就是我在字典中存储对象时使用的键。我首先处理标题,这样就可以通过删除空格并将其截断为50个字符来将其用作键 然而,有些标题相当长,前50个字符与另一个标题完全相同。正因为如此,钥匙被拧坏了。有谁能建议一个更好的方法来做这件事吗。我在考虑用某种方式对标题进行编码,然后使用它 您无需删除空格或截断标题即可将其用作字典键。Python字典键可以是任何不可变的Python类型,其中str甚至是带有空格和特殊字符的长键 只需使用整个标题

我有一个需要存储在字典中的对象列表。这些对象的一个属性是title,这就是我在字典中存储对象时使用的键。我首先处理标题,这样就可以通过删除空格并将其截断为50个字符来将其用作键


然而,有些标题相当长,前50个字符与另一个标题完全相同。正因为如此,钥匙被拧坏了。有谁能建议一个更好的方法来做这件事吗。我在考虑用某种方式对标题进行编码,然后使用它

您无需删除空格或截断标题即可将其用作字典键。Python字典键可以是任何不可变的Python类型,其中str甚至是带有空格和特殊字符的长键

只需使用整个标题,或使用哈希对标题进行编码:

>>> import hashlib
>>> hashlib.md5('some random title').hexdigest()
'bc847ea8db214557c611c9b3c2f043b1'

您无需删除空格或截断标题即可将其用作字典键。Python字典键可以是任何不可变的Python类型,其中str甚至是带有空格和特殊字符的长键

只需使用整个标题,或使用哈希对标题进行编码:

>>> import hashlib
>>> hashlib.md5('some random title').hexdigest()
'bc847ea8db214557c611c9b3c2f043b1'

只需将整个标题散列即可

from hashlib import sha1
sha1('title1').hexdigest()

只需将整个标题散列即可

from hashlib import sha1
sha1('title1').hexdigest()

正因为如此,钥匙被弄坏了,那你为什么要截断?就让它们作为一个整体吧。@NiklasB。这是对的。还有,为什么要删除空格?您可以使用任何字符串(包括带空格的字符串)作为字典键。@David:也许对于规范化来说,这会有一些意义。然而,我看不出截断是如何适应的。正因为如此,钥匙被弄乱了。那么,你为什么要截断?就让它们作为一个整体吧。@NiklasB。这是对的。还有,为什么要删除空格?您可以使用任何字符串(包括带空格的字符串)作为字典键。@David:也许对于规范化来说,这会有一些意义。但是,我看不出截断是如何适应的,我看不出这将如何节省空间,因为只会存储对字符串的引用。但是,这将大大增加查找密钥所需的时间,因为哈希值必须在每次timeFirst时计算,CPython将只在内部存储对小字符串的引用。我不知道长度限制是什么,而且它闻起来依赖于实现,所以我不确定是否只依赖于存储的引用。这可以节省空间,如果有许多大标题,如原来的海报所示,这条格言是曾经序列化。很天真,python会将整个标题存储为键,并可能再次存储在值中。如果平均标题大于32字节,则在某些情况下,上面的md5散列可以节省空间。由于这种方法的速度要慢得多,我希望你们能证明这一点。Triptchy:字符串是不可变的。它们在内存中只存在一次,除非您复制它们。我所知道的每一个实现都是这样工作的,为什么有人会选择这种替代方案,即无理由地复制大的东西?你能为CPython提供一个引用吗?它只在内部存储对小字符串的引用?编辑:好的,在后端数据库中进行序列化或存储是我能想到的唯一原因。我不想说的是,“ab”*256是“ab”*256 False>>“ab”*10是“ab”*10 true。我们不是在讨论实习,而是在哈希表中查找字符串键,在这种情况下,字符串将具有相同的原始位置。在任何情况下,如果他们不这样做,您都必须为哈希表计算一个哈希,这在任何情况下都是打开的。我不认为这会节省空间,因为只会存储对字符串的引用。但是,这将大大增加查找密钥所需的时间,因为哈希值必须在每次timeFirst时计算,CPython将只在内部存储对小字符串的引用。我不知道长度限制是什么,而且它闻起来依赖于实现,所以我不确定是否只依赖于存储的引用。这可以节省空间,如果有许多大标题,如原来的海报所示,这条格言是曾经序列化。很天真,python会将整个标题存储为键,并可能再次存储在值中。如果平均标题大于32字节,则在某些情况下,上面的md5散列可以节省空间。由于这种方法的速度要慢得多,我希望你们能证明这一点。Triptchy:字符串是不可变的。它们在内存中只存在一次,除非您复制它们。我所知道的每一个实现都是这样工作的,为什么有人会选择这种替代方案,即无理由地复制大的东西?你能为CPython提供一个引用吗?它只在内部存储对小字符串的引用?编辑:好的,在后端数据库中进行序列化或存储是我能想到的唯一原因。我不想说的是,“ab”*256是“ab”*256 False>>“ab”*10是“ab”*10 true。我们不是在说实习,我们是在说
ng关于在哈希表中查找字符串键,在这种情况下,字符串将具有相同的原始位置。在任何情况下,如果他们不这样做,你就必须为哈希表计算一个哈希值,这在任何情况下都是打开的。然后呢?哈希表已经做了类似的事情,你知道吗?是的,确实如此。我可能会用PK。但是你怎么才能得到一个便宜的,恒定长度的唯一文本呢?我们可以用字符串作为键,它已经在内存中了?然后呢?哈希表已经做了类似的事情,你知道吗?是的,确实如此。我可能会用PK。但是你怎么才能得到一个便宜的,恒定长度的唯一文本呢?我们可以用字符串作为键,它已经在内存中了?