使用列表推导来比较两个数组的元素

时间:2013-10-21 15:29:08

标签: python list-comprehension

如何在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方法。

3 个答案:

答案 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