如何在python中使用list comprehension来比较两个数组是否具有相同的元素?
我做了以下事情:
>>> aa=[12,3,13];
>>> bb=[3,13,12];
>>> pp=[True for x in aa for y in bb if y==x]
>>> pp
[True, True, True]
>>> bb=[3,13,123];
>>> pp=[True for x in aa for y in bb if y==x]
[True, True]
如果不是真的话我也想输出False,而不是像后一种情况那样输出两个真实但不知道怎么做。
最后,我希望获得一个True / False值(如果全部为true则为true,如果其中一个为false,则为false)而不是true和/或false列表。我知道迭代pp的简单循环(真假列表)就足够了,但我确信有更多的pythonic方法。
答案 0 :(得分:7)
您正在针对另一个列表的每个元素测试每个列表的每个元素,找到True
的所有组合。除了效率低下,这也是不正确的方法。
请使用成员资格测试,并使用True
函数查看所有这些测试all()
:
all(el in bb for el in aa)
all()
如果您提供的可迭代的每个元素都是True
,则返回True
,否则返回False
。
如果列表相同,这将无法测试;你还需要测试长度:
len(aa) == len(bb) and all(el in bb for el in aa)
为更长的bb
列表提高效率;首先从该列表中创建set()
:
def equivalent(aa, bb):
if len(aa) != len(bb):
return False
bb_set = set(bb)
return all(el in bb_set for el in aa)
这仍然不能很好地处理重复的数字;使用此方法[1, 1, 2]
相当于[1, 2, 2]
。你没有说明在这种角落里应该发生什么;唯一严格的等效测试是对两个输入进行排序:
len(aa) == len(bb) and sorted(aa) == sorted(bb)
我们首先测试长度,以避免在长度不同的情况下进行排序。
如果允许重复,无论输入的长度如何,您都可以完全放弃循环并只使用集合:
not set(aa).symmetric_difference(bb)
测试它们是否具有相同的独特元素。
答案 1 :(得分:2)
set(aa) == set(bb)
这具有相同的效果,但可能会稍快一些
not set(aa).symmetric_difference(bb)
如果您需要[1,1]
不等同于[1]
做
sorted(aa) == sorted(bb)
答案 2 :(得分:1)
“您正在针对每个元素测试每个列表的每个元素 另一个列表,找到所有True组合。除了 效率低下,这也是不正确的做法。“
我同意上述声明,下面的代码也列出了False
值,但我认为你真的不需要这个。
>>> bp = [y==x for x in aa for y in bb]
[False, False, True, True, False, False, False, True, False]
>>> False in bp
True