我如何在 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)
测试它们是否具有相同的唯一元素。
