如何找出Python中包含列表的两个列表之间的差异?

如何找出Python中包含列表的两个列表之间的差异?,python,list,Python,List,如果我们有 X1=[[a,b,c],[a,e,t],[a,b,c]] 及 我想找出X1和X2之间的区别,即: X3=X1-X2=[[a,b,c],[a,e,t]]. 所以我的输出应该包含两个列表,而不是一个,因为我只想删除一个[a,b,c],而不是两个 我是这样做的,但我得到了错误: s = set(X2) X3 = [x for x in X1 if x not in s] 我得到的错误是: unhashable type: 'list' 当程序到达这一点时,我得到了这个错误: s

如果我们有

X1=[[a,b,c],[a,e,t],[a,b,c]] 

我想找出X1和X2之间的区别,即:

X3=X1-X2=[[a,b,c],[a,e,t]].
所以我的输出应该包含两个列表,而不是一个,因为我只想删除一个[a,b,c],而不是两个

我是这样做的,但我得到了错误:

s = set(X2)
X3 = [x for x in X1 if x not in s]
我得到的错误是:

unhashable type: 'list'
当程序到达这一点时,我得到了这个错误:

s = set(X2)

正如错误所述,列表是不可修改的(因为它们是可变的)。将列表列表转换为可散列的元组列表:

>>> hash((1, 2, 3))
2528502973977326415
>>> hash([1, 2, 3])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'

正如错误所述,列表是不可修改的(因为它们是可变的)。将列表列表转换为可散列的元组列表:

>>> hash((1, 2, 3))
2528502973977326415
>>> hash([1, 2, 3])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'

那么,
X3=[a,e,t]
,对吗

不需要将其转换为set。您可以这样做:


result=[x代表X1中的x,如果x不在X2中]
那么,
X3=[a,e,t]
,对吗

不需要将其转换为set。您可以这样做:

result=[x代表X1中的x,如果x不在X2中]
列表不可损坏,因此它们不能是
集合的成员。您可以将内部列表转换为
冻结集
,因此具有相同项但顺序不同的两个子列表仍然被视为相同,然后使用查找两个列表之间的差异:

from collections import Counter

X3 = Counter([frozenset(i) for i in X1]) - Counter([frozenset(i) for i in X2])
print(X3)
# Counter({frozenset({'c', 'a', 'b'}): 1, frozenset({'e', 'a', 't'}): 1})

print(X3.keys())
# [frozenset({'e', 't', 'a'}), frozenset({'c', 'b', 'a'})]
A是A
dict
的子类,因此可以使用
.keys()
将差异作为列表返回:

如果需要保留内部的
列表
s,可以通过执行以下操作将
冻结集
替换为列表:

X3 = [list(i) for i in X3.keys()]

print(X3)
# [['a', 't', 'e'], ['c', 'a', 'b']]
列表是不可损坏的,因此它们不能是
集合的成员。您可以将内部列表转换为
冻结集
,因此具有相同项但顺序不同的两个子列表仍然被视为相同,然后使用查找两个列表之间的差异:

from collections import Counter

X3 = Counter([frozenset(i) for i in X1]) - Counter([frozenset(i) for i in X2])
print(X3)
# Counter({frozenset({'c', 'a', 'b'}): 1, frozenset({'e', 'a', 't'}): 1})

print(X3.keys())
# [frozenset({'e', 't', 'a'}), frozenset({'c', 'b', 'a'})]
A是A
dict
的子类,因此可以使用
.keys()
将差异作为列表返回:

如果需要保留内部的
列表
s,可以通过执行以下操作将
冻结集
替换为列表:

X3 = [list(i) for i in X3.keys()]

print(X3)
# [['a', 't', 'e'], ['c', 'a', 'b']]


X3
的值是什么?X3应该是[[a,b,c],[a,e,t]],因为我只想从X1中删除一个[a,b,c],而不是两个。X3的值是什么?X3应该是[[a,b,c],[a,e,t]],因为我只想从X1中删除一个[a,b,c],而不是两个都删除。或者
set={tuple(sublist)对于X2中的子列表}
如果您更喜欢理解。@Daerdemandt因为地图不包含lambda,所以速度可能更快。而且,它更干净/可读性更强。是的,地图通常更快。尽管如此,许多人仍然喜欢理解。至于“更清晰/可读性更强”,这是主观的。或者如果您更喜欢理解,那么X2中的子列表的
set={tuple(sublist)}
。@Daerdemandt因为映射不涉及lambda,所以可能更快。而且,它更干净/可读性更强。是的,地图通常更快。尽管如此,许多人仍然喜欢理解。至于“更清晰/可读性更强”,这是主观的。如果子列表中的项目顺序不一致,那么这将失败。3应该是[[a,b,c],[a,e,t]],因为我只希望从X1中删除一个[a,b,c],而不是两个。哦,好的,然后你应该用这个信息更新你的问题。如果子列表中项目的顺序不一致,这将失败。3应该是[[a,b,c],[a,e,t]],因为我只想从X1中删除一个[a,b,c],而不是两个。哦,好的,那么你应该用这个信息更新你的问题。X3应该是[[a,b,c],[a,e,t]],因为我只想要一个[a,b,c]无法从X1中同时删除。这甚至没有给我一个列表。您是否尝试了
.keys()
?是的。它给了我一个包含一个冻结集的列表,我猜你在用我以前的答案。我已经更新了.X3应该是[[a,b,c],[a,e,t]],因为我只希望从X1中删除一个[a,b,c],而不是两个都删除。这甚至没有给我一个列表。您是否尝试了
.keys()
?是的。它给了我一个包含一个冻结集的列表,我猜你在用我以前的答案。我已经更新了。