您可以使用tuples(可散列)。像lists 这样的可变对象是不可散列的,而像tuples 这样的不可变对象是不可散列的。 sets 和 dicts 在内部依赖哈希。
items = set()
for nested_item in nested_items:
items.add(tuple(nested_item))
这也可以在一行中完成:
items = set(tuple(nested_item) for nested_item in nested_items)
或
items = {tuple(nested_item) for nested_item in nested_items}
在所有三种情况下,输出将是(给定一些示例nested_items):
nested_items = [[1, 2], [2, 3], [1, 2], [3, 4], [4, 5], [2, 3]]
items = {(1, 2), (2, 3), (3, 4), (4, 5)}
另外,请务必在检查成员资格时将任何 lists 转换为 tuples:
print([1, 2] in items)
# TypeError: unhashable type: 'list'
print(tuple([1, 2]) in items)
# True
print((1, 2) in items)
# True
有时,一个列表包含其他列表,一个简单的tuple 调用是不够的:
print(tuple([[1, 2], [3, 4]]))
([1, 2], [3, 4])
在这种情况下,请改用简单的配方进行转换:
def to_tuple(t):
return tuple(map(to_tuple, t)) if isinstance(t, (list, tuple)) else t
to_tuple([1, [2, (3,), [4], [5, 6, 7]], (8, 9)])
(1, (2, (3,), (4,), (5, 6, 7)), (8, 9))