繁体   English   中英

如何在Python中找到包含列表的两个列表之间的区别?

[英]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'})]

Counterdict的子类,因此您可以使用.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM