gpt4 book ai didi

python - 在 python 中制作一个可哈希的整数列表

转载 作者:太空宇宙 更新时间:2023-11-04 07:07:23 24 4
gpt4 key购买 nike

我有一个整数列表,我想将它们用作 python 字典中的键。我正在缓存一个以整数列表作为输入的函数的结果。我目前的解决方案:

list_of_ints = [1,20,3,4]
key = str(sorted(list_of_ints))[1:-1].replace(' ','')

生成 key “1,3,4,20”。似乎应该有一种更快/更漂亮/更 Pythonic 的方式来做到这一点。

最佳答案

只需使用一个元组作为键。元组是不可变和可散列的,因此它们可用作字典键。

list_of_ints = [1, 20, 3, 4]
# tuple(list_of_ints) == (1, 20, 3, 4)

some_dict = {tuple(list_of_ints): "some value", ...}

值得注意的是,他们确实关心秩序,所以 [1, 20, 3, 4]不会产生与 [1, 3, 20, 4] 相同的值

您甚至可以创建一个容器来为您执行此操作。

class MyDict(dict):
def __getitem__(self, key):
key = tuple(sorted(key))
return super().__getitem__(key)
# similar for pop, get, setdefault, update....

>>> d = MyDict()
>>> d[1,2,3] = 4
>>> d[3,2,1]
4

不要尝试自己序列化它。如果这样做,请不要使用字符串操作——它太丑陋了。如果您确实内存不足或者您有数十万条这样的记录,您可以通过如下序列化来节省微不足道的空间:

def my_serialize(key_nums: list):
key_nums = sorted(key_nums)
base = max(key_nums)
sum_ = 0
for power, num in enumerate(key_nums):
sum_ += base**power * num
return sum_

这应该给你一个唯一的(难以置信的大!)整数来存储它在内存中比元组小。如果可以避免,请不要这样做——它非常不透明。


在您提到的评论中,键中不会有重复值,因此 frozenset绝对是您要找的。

d = {}
list_of_ints = [1, 20, 3, 4]
d[frozenset(list_of_ints)] = "some value"

frozenset 对象是不可变的可哈希 set -样的物体。它们与顺序无关并忽略重复项。

关于python - 在 python 中制作一个可哈希的整数列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35004882/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com