[英]How to find the difference between two lists that contain lists in Python?
如果我们有
X1=[[a,b,c],[a,e,t],[a,b,c]]
和
X2=[[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)
那么X3 = [a,e,t]
,对吗?
无需将其转换为set。 你可以这样做:
result = [x for x in X1 if x not in X2]
。
列表不可散列,因此不能成为set
成员。 您可以将内部列表转换为frozenset
,因此frozenset
具有相同项目但顺序不同的两个子列表视为相同,然后使用Counter
查找两个列表之间的差异 :
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'})]
Counter
是dict
的子类,因此您可以使用.keys()
将差异作为列表返回:
print(X3.keys()) # or print(list(X3.keys())) in Python 3.x
# [frozenset({'e', 't', 'a'}), frozenset({'c', 'b', 'a'})]
如果您需要保留内部list
s,则可以通过执行以下frozenset
用列表替换frozenset
:
X3 = [list(i) for i in X3.keys()]
print(X3)
# [['a', 't', 'e'], ['c', 'a', 'b']]
由于错误状态,列表是不可散列的(因为它们是可变的)。 将列表列表转换为可哈希的元组列表:
>>> hash((1, 2, 3))
2528502973977326415
>>> hash([1, 2, 3])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
就您而言,您可以执行以下操作:
s = set(map(tuple, X2))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.