我想查看某个项目是否已在列表或集合中。通常,我会这样做(如果不是字典):
items = set()
for nested_item in nested_items:
items.append(nested_item)
但是,这给了我一个错误:
TypeError:不可散列的类型:“列表”
我现在能做的唯一方法如下:
items = list()
for nested_item in nested_items:
if nested_item not in items:
items.append(nested_item)
有更好的方法吗?有没有办法仍然使用set
?
答案 0 :(得分:2)
您可以使用UPDATE `task`
SET task_users = REGEXP_REPLACE(task_users, CONCAT('(,', @userID, '|', @userID, ',?)'), '');
WHERE task_users RLIKE CONCAT('(^|,)', @userID,'(,|$)')
(可散列)。像tuple
这样的可变对象是不可哈希的,而像list
这样的可变对象是不可哈希的。 tuple
和set
的内部依赖哈希值。
dict
这也可以一行完成:
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)}
转换为list
:
tuple
有时,一个列表包含其他列表,仅进行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])
答案 1 :(得分:0)
对于集以及字典键,您必须使用可哈希对象。这是必需的,因为在基础实现中使用了哈希。在其他类型中,类似的类型可能称为哈希表,您可以在名称中直接看到哈希的重要性。
如果您能够为某项计算机唯一的可复制键,则可以使用该键和该项作为值的字典。如果没有,则字典和字典都不适合您的问题。
BTW集使用.add()
代替.append()
。