只需使用元组作为键。元组是不可变且可散列的,因此它们可用作字典键。
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_
它应该给你一个唯一的(非常大的!)整数来存储,它在内存中比元组小。如果可以避免,请不要这样做——它非常不透明。
在您提到的 cmets 中,您的键中不会有重复的值,因此 frozenset 绝对是您要查找的内容。
d = {}
list_of_ints = [1, 20, 3, 4]
d[frozenset(list_of_ints)] = "some value"
frozenset 对象是不可变的哈希 set 类对象。它们与顺序无关并且忽略重复。