从两个列表中删除两个集合列表的交集,并将其附加到python中的新列表中

从两个列表中删除两个集合列表的交集,并将其附加到python中的新列表中,python,list,set,Python,List,Set,我想取集合列表的交点x1,y2,将它们从两个列表中删除,然后将其附加到一个新的列表“res”。 这是我的代码:(我认为这是可行的) 我也试过这样做: 但当它是一个集合列表时,会出现错误: x1=[{'A'},{'B'},{'c'},{'D'}] y1=[{'A'},{'B'},{'C'},{'d'}] res=[] res.append(list(set(x1) & set(x2))) print(x1,y1) print(res) >TypeError: unhashable

我想取集合列表的交点
x1,y2
,将它们从两个列表中删除,然后将其附加到一个新的列表“res”。
这是我的代码:(我认为这是可行的)

我也试过这样做:

但当它是一个集合列表时,会出现错误:

x1=[{'A'},{'B'},{'c'},{'D'}]
y1=[{'A'},{'B'},{'C'},{'d'}]
res=[]
res.append(list(set(x1) & set(x2)))
print(x1,y1)
print(res)

>TypeError: unhashable type: 'set'
有没有更好的方法写这篇文章?
如有任何帮助或建议,将不胜感激

更新:

x1=[{'A'},{'B'},{'c'},{'D'}]
y1=[{'A'},{'B'},{'C'},{'d'}]
x2= {e for i in x1 for e in i}
y2= {e for i in y1 for e in i}
z1 = x2.intersection(y2)
res = [{e} for e in z1]
x1=[{e} for e in x2-z1]
y1=[{e} for e in y2-z1]
print(x1,y1)
>[{'c'}, {'D'}] [{'C'}, {'d'}]
print(res)
>[{'A'}, {'B'}]
但当集合的大小大于1时:

x1=[{'A','B'},{'B'},{'c'},{'D'}]
y1=[{'A'},{'B'},{'C'},{'d'}]
x2= {e for i in x1 for e in i}
y2= {e for i in y1 for e in i}
z1 = x2.intersection(y2)
res = [{e} for e in z1]
x1=[{e} for e in x2-z1]
y1=[{e} for e in y2-z1]
print(x1,y1)
>[{'D'}, {'c'}] [{'C'}, {'d'}]
print(res)
>[{'B'}, {'A'}]
假设输出:

x1=[{'A','B'},{'B'},{'c'},{'D'}]
y1=[{'A'},{'B'},{'C'},{'d'}]
res=[]
for i in x1:
    if i in y1:
        res.append(i)
        x1.remove(i)
        y1.remove(i)
for i in y1:
    if i in x1:
        res.append(i)
        x1.remove(i)
        y1.remove(i)
print(x1,y1)
>[{'B', 'A'}, {'c'}, {'D'}] [{'A'}, {'C'}, {'d'}]
print(res)
[{'B'}]

如何修复此问题?

使用
.intersection()
方法尝试此方法

>>> x1=[{'A'},{'B'},{'c'},{'D'}]
>>> _x1= {e for i in x1 for e in i}     
>>> _x1     
{'c', 'B', 'D', 'A'}
>>> y1=[{'A'},{'B'},{'C'},{'d'}]        
>>> _y1= {e for i in y1 for e in i} 
>>> _y1 
{'d', 'B', 'A', 'C'}
>>> z1 = _x1.intersection(_y1) # intersection   

输出:

>>> [{e} for e in z1]   
[{'B'}, {'A'}]

>>> print(x1,y1)
[{'c'}, {'D'}] [{'C'}, {'d'}]
说明:

>>> [{e} for e in z1]   
[{'B'}, {'A'}]

>>> print(x1,y1)
[{'c'}, {'D'}] [{'C'}, {'d'}]
  • 将集合列表转换为集合并将其存储到临时变量中,并使用由提供的
    .intersection()
    内置函数
    set()
  • 最后,转换为所需格式(即集合列表)

使用
.intersection()
方法尝试此操作

>>> x1=[{'A'},{'B'},{'c'},{'D'}]
>>> _x1= {e for i in x1 for e in i}     
>>> _x1     
{'c', 'B', 'D', 'A'}
>>> y1=[{'A'},{'B'},{'C'},{'d'}]        
>>> _y1= {e for i in y1 for e in i} 
>>> _y1 
{'d', 'B', 'A', 'C'}
>>> z1 = _x1.intersection(_y1) # intersection   

输出:

>>> [{e} for e in z1]   
[{'B'}, {'A'}]

>>> print(x1,y1)
[{'c'}, {'D'}] [{'C'}, {'d'}]
说明:

>>> [{e} for e in z1]   
[{'B'}, {'A'}]

>>> print(x1,y1)
[{'c'}, {'D'}] [{'C'}, {'d'}]
  • 将集合列表转换为集合并将其存储到临时变量中,并使用由提供的
    .intersection()
    内置函数
    set()
  • 最后,转换为所需格式(即集合列表)
将这些集合列表转换为冻结集合集合,取交叉点,然后再转换回:

x1=[{'A'},{'B'},{'c'},{'D'}]
y1=[{'A'},{'B'},{'C'},{'d'}]

def list_of_sets_to_set_of_frozensets(l):
    return set(map(frozenset, l))

def set_of_frozensets_to_list_of_sets(s):
    return list(map(set, s))

res = set_of_frozensets_to_list_of_sets(list_of_sets_to_set_of_frozensets(x1) & list_of_sets_to_set_of_frozensets(y1))

print(x1,y1)
print(res)
将这些集合列表转换为冻结集合集合,获取交点,然后再转换回:

x1=[{'A'},{'B'},{'c'},{'D'}]
y1=[{'A'},{'B'},{'C'},{'d'}]

def list_of_sets_to_set_of_frozensets(l):
    return set(map(frozenset, l))

def set_of_frozensets_to_list_of_sets(s):
    return list(map(set, s))

res = set_of_frozensets_to_list_of_sets(list_of_sets_to_set_of_frozensets(x1) & list_of_sets_to_set_of_frozensets(y1))

print(x1,y1)
print(res)

我终于明白了,谢谢!我认为使用这种方法似乎还有一些缺陷,请检查update@Manx我已经在
\ux1
\uy1
中存储了,我想你没有注意到前面的编辑。我终于找到了,谢谢!我认为使用这种方法似乎还有一些缺陷,请检查update@Manx我已经在
\ux1
\uy1
中存储了,我想你没有注意到前面的编辑。