如何在python中将列表列表转换为集合,以便与其他集合进行比较?

2024-04-25 19:41:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个列表users_with_invites_ids_list,由循环形成,在这个循环中我将值附加到列表,在python中,如下所示:

...[ObjectId('55119e14bf2e4e010d8b48f2')], [ObjectId('54624128bf2e4e5e558b5a52')], [ObjectId('53a6e7bc763f4aa0308b4569')], [ObjectId('55241823bf2e4e59508b494c')]]

当我尝试:

    users_with_invites_ids_set = set(users_with_invites_ids_list)

我得到:

TypeError: unhashable type: 'list'

如何将此列表转换为集合?

编辑

根据回答,我已经做了以下工作:

#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)

产生以下结果:

 (ObjectId('542ac5a6763f4a82188b4a51'),), (ObjectId('54496fe6bf2e4efe348bd344'),), (ObjectId('54c96339bf2e4ee62c8b48e0'),)])

我如何得到每一个ObjectId而不在每个()周围。这使我无法将这组ID与其他组的ID进行比较。


Tags: idids列表typewithuserslistfirst
2条回答

虽然接受的答案是好的,但是如果您想要比较简单的答案,并且不想处理元组的不变性,那么您也可以尝试使用传统的字符串比较:

list1 = [[], [60], [95], [60, 95]]
list2 = [[], [95], [60], [60, 95]]
print(set(str(x) for x in list1) == set(str(x) for x in list2))

您需要将内部列表转换为元组,假设这些ObjectId('55119e14bf2e4e010d8b48f2')中的每一个都是散列的:

users_with_invites_ids_set = set(tuple(x) for x in users_with_invites_ids_list)

工作示例:

>>> 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>,)])

如果您希望单独创建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>])

相关问题 更多 >