Skip to main content
 首页 » 编程设计

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

2025年05月04日9bluestorm

我有一个整数列表,我想将它们用作 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 -样的物体。它们与顺序无关并忽略重复项。