Skip to main content
 首页 » 编程设计

python之使用列表理解来比较两个数组的元素

2025年05月04日9lvdongjie

我如何在 python 中使用列表理解来比较两个数组是否具有相同的元素?

我做了以下事情:

>>> 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] 

如果不是真的,我也想输出假,而不是像后一种情况那样只输出两个真,但不知道该怎么做。

最后,我想得到一个 True/False 值(如果全部为真则为真,如果其中一个为假则为假)而不是真和/或假的列表。我知道迭代 pp(true 和 false 列表)的简单循环就足够了,但我确信还有更多 pythonic 方法。

请您参考如下方法:

您正在针对另一个列表的每个元素测试每个列表的每个元素,找到所有True 的组合。除了效率低下,这也是错误的做法。

改为使用成员资格测试,并使用 all() 函数查看所有这些测试都是 True:

all(el in bb for el in aa) 

all() 返回 True 如果你给它的 iterable 的每个元素都是 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) 

测试它们是否具有相同的唯一元素。