用元组作为键就行了。元组是不可变的和散列的,所以它们作为字典键很有用。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"
^{}对象是不可变的可散列的set类对象。它们是不可知论的,忽略了重复。