如何将列表列表转换为python中的一组,以便我可以与其他集进行比较?

时间:2021-10-08 12:01:50

I have a list users_with_invites_ids_list, formed by loop where I append values to the list, in python that looks like this:

我有一个列表users_with_invites_ids_list,由循环形成,我将值附加到列表中,在python中看起来像这样:

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

when I try:

当我尝试:

    users_with_invites_ids_set = set(users_with_invites_ids_list)

I get:

TypeError: unhashable type: 'list'

How do I convert this list of lists to a set?

如何将此列表列表转换为一组?

EDIT

based on answer I've done the following:

根据答案,我做了以下几点:

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

Which yields the following:

产生以下结果:

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

How do I get each ObjectId without the () around each one. It's keeping me from comparing this set to other set's of ids.

如何在每个ObjectId周围没有()的情况下获取每个ObjectId。它阻止我将这个集合与其他集合的ID进行比较。

2 个解决方案

#1


You would need to convert the inner lists to tuples, assuming each of those ObjectId('55119e14bf2e4e010d8b48f2') is hashable:

假设每个ObjectId('55119e14bf2e4e010d8b48f2')都是可清除的,你需要将内部列表转换为元组:

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

Working example:

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

In case if you are looking to create the set of the ObjectId's alone, you could do:

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

#2


While the accepted answer is good, if you'd like something simpler for comparison and don't want to deal with the immutability of tuples, you could also try it using good old-fashioned string comparison:

虽然接受的答案是好的,如果你想要比较简单的东西并且不想处理元组的不变性,你也可以尝试使用良好的老式字符串比较:

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

#1


You would need to convert the inner lists to tuples, assuming each of those ObjectId('55119e14bf2e4e010d8b48f2') is hashable:

假设每个ObjectId('55119e14bf2e4e010d8b48f2')都是可清除的,你需要将内部列表转换为元组:

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

Working example:

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

In case if you are looking to create the set of the ObjectId's alone, you could do:

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

#2


While the accepted answer is good, if you'd like something simpler for comparison and don't want to deal with the immutability of tuples, you could also try it using good old-fashioned string comparison:

虽然接受的答案是好的,如果你想要比较简单的东西并且不想处理元组的不变性,你也可以尝试使用良好的老式字符串比较:

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