gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 07:01:49 27 4
gpt4 key购买 nike

我如何在 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)

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

关于python - 使用列表理解来比较两个数组的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19498687/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com