Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中将数组与其他数组一起使用_Python_Arrays_Extract - Fatal编程技术网

在Python中将数组与其他数组一起使用

在Python中将数组与其他数组一起使用,python,arrays,extract,Python,Arrays,Extract,试图找到一种有效的方法从另一个数组中提取一个数组中的所有项实例 比如说 array1 = ["abc", "def", "ghi", "jkl"] array2 = ["abc", "ghi", "456", "789"] 数组1是需要从数组2中提取的项的数组。因此,数组2应该修改为[“456”,“789”] 我知道如何做到这一点,但没有有效的方法。如果您的列表不能包含重复项,并且您不关心顺序,那么您应该使用集合而不是列表(顺便说一句,它们被称为列表,而不是数组)。那么,您希望实现的既快速又

试图找到一种有效的方法从另一个数组中提取一个数组中的所有项实例

比如说

array1 = ["abc", "def", "ghi", "jkl"]

array2 = ["abc", "ghi", "456", "789"]
数组1是需要从数组2中提取的项的数组。因此,数组2应该修改为
[“456”,“789”]


我知道如何做到这一点,但没有有效的方法。

如果您的列表不能包含重复项,并且您不关心顺序,那么您应该使用集合而不是列表(顺便说一句,它们被称为列表,而不是数组)。那么,您希望实现的既快速又简单:

>>> set1 = set(["abc", "def", "ghi", "jkl"])
>>> set2 = set(["abc", "ghi", "456", "789"])
>>> set2 - set1
set(['456', '789'])
如果列表2可能包含重复项或顺序问题,则仍然可以将列表1设置为一个集合,以加快查找速度:

>>> list1 = ["abc", "def", "ghi", "jkl"]
>>> list2 = ["abc", "ghi", "456", "789"]
>>> set1 = set(list1)
>>> [a for a in list2 if a not in set1]
['456', '789']
请注意,这要求项目是可散列的,但运行时间接近O(n)

如果项目不可散列,但可排序,则可以对列表1排序,并使用二进制搜索查找其中的项目。这就给了O(n log(n))时间


如果您的项目既不可散列也不可排序,那么您需要对每个元素进行缓慢的O(n*n)简单线性搜索。

这些是列表,而不是数组。(单词“array”对不同的人意味着不同的东西,但在python中,对象称自己为列表,就是这样;还有其他模块提供称自己为数组的对象,例如and)

要回答您的问题,最简单的方法是根本不修改array2。使用列表理解:

set1 = set(array1)
array2 = [e for e in array2 if e not in set1]
(集合将此O(n)替换为O(n^2))

如果绝对必须对array2进行变异(因为它存在于其他地方),则可以使用切片分配:

array2[:] =  [e for e in array2 if e not in set1]
它同样有效,但有点恶心


编辑:正如马克·拜尔斯指出的,只有当数组1只包含可散列元素(如字符串、数字等)时,这种方法才有效

array2 = [i for i in array2 if i not in array1]

列表理解是您在这里需要的

,如果您不关心顺序。不..我不想要两者之间的区别。虽然这不是确切的场景…数组1是一个坏词列表,数组2是一个搜索词列表。我想得到一个搜索词的结果,其中删除了数组1中主列表中所有不好的词。re:二进制搜索:对分模块()很好。@Scott:不,我只是得到了列表1和列表2的错误方向-现在已经修复了。顺便说一下,坏话应该是一个集合-顺序并不重要,没有理由重复。“史葛,听起来至少是代码> List2应该是一个集合,也可能是代码> List1。如果你不关心重复或命令,你应该考虑做<代码> SET(ARARY2)-集合(ARARY2)。