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

时间:2016-07-01 15:06:32

标签: python list

如果我们有

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)

3 个答案:

答案 0 :(得分:4)

那么,X3 = [a,e,t],对吧?

无需将其转换为设置。你可以这样做:

result = [x for x in X1 if x not in X2]

答案 1 :(得分:1)

列表是不可用的,因此它们不能是set的成员。您可以将内部列表转换为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,则可以通过以下方式将frozenset替换为列表:

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

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

答案 2 :(得分:0)

如错误所述,列表是不可删除的(因为它们是可变的)。将列表列表转换为可以清除的元组列表:

send(reinterpret_cast<unsigned*>(&buffer))

在你的情况下,你可以这样做:

new