我有一个列表users_with_invites_ids_list,由循环形成,我将值附加到列表中,在python中看起来像这样:
...[ObjectId('55119e14bf2e4e010d8b48f2')], [ObjectId('54624128bf2e4e5e558b5a52')], [ObjectId('53a6e7bc763f4aa0308b4569')], [ObjectId('55241823bf2e4e59508b494c')]]
Run Code Online (Sandbox Code Playgroud)
当我尝试:
users_with_invites_ids_set = set(users_with_invites_ids_list)
Run Code Online (Sandbox Code Playgroud)
我明白了:
TypeError: unhashable type: 'list'
Run Code Online (Sandbox Code Playgroud)
如何将此列表列表转换为一组?
编辑
根据答案,我做了以下几点:
#convert list to set
first_tuple_list = [tuple(lst) for lst in users_with_invites_ids_list]
users_with_invites_ids_set = set(first_tuple_list)
Run Code Online (Sandbox Code Playgroud)
产生以下结果:
(ObjectId('542ac5a6763f4a82188b4a51'),), (ObjectId('54496fe6bf2e4efe348bd344'),), (ObjectId('54c96339bf2e4ee62c8b48e0'),)])
Run Code Online (Sandbox Code Playgroud)
我如何在ObjectId没有()每个人的情况下获得每一个.它阻止我将这个集合与其他集合的ID进行比较.
您需要将内部列表转换为元组,假设每个列表ObjectId('55119e14bf2e4e010d8b48f2')都是可清除的:
users_with_invites_ids_set = set(tuple(x) for x in users_with_invites_ids_list)
Run Code Online (Sandbox Code Playgroud)
工作范例:
>>> class ObjectId(object):
... def __init__(self, v):
... self.v = v
...
>>> list_of_lists = [[ObjectId('55119e14bf2e4e010d8b48f2')], [ObjectId('54624128bf2e4e5e558b5a52')], [ObjectId('53a6e7bc763f4aa0308b4569')], [ObjectId('55241823bf2e4e59508b494c')]]
>>> set(tuple(x) for x in list_of_lists)
set([(<__main__.ObjectId object at 0x7f71483cfc50>,), (<__main__.ObjectId object at 0x7f71483cfd10>,), (<__main__.ObjectId object at 0x7f71483cfcd0>,), (<__main__.ObjectId object at 0x7f71483cfc90>,)])
Run Code Online (Sandbox Code Playgroud)
如果你想创建ObjectId单独的一套,你可以这样做:
>>> set(x for lst in list_of_lists for x in lst)
set([<__main__.ObjectId object at 0x7f71483cfb10>, <__main__.ObjectId object at 0x7f71483db050>, <__main__.ObjectId object at 0x7f71483cfad0>, <__main__.ObjectId object at 0x7f71483cfd50>])
Run Code Online (Sandbox Code Playgroud)