Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.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 - Fatal编程技术网

Python 除其他外的数组

Python 除其他外的数组,python,Python,我有两个阵列: arr1 = [a,b,c,d,e] arr2 = [c,d,e] 我想给出除arr2之外的数组arr1。因此您需要两个列表的差异: list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] list2 = [1, 2, 3, 4, 4, 6, 7, 8, 11, 77] def list_difference(list1, list2): """uses list1 as the reference, returns list of items

我有两个阵列:

arr1 = [a,b,c,d,e]
arr2 = [c,d,e]

我想给出除arr2之外的数组arr1。

因此您需要两个列表的差异:

list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
list2 = [1, 2, 3, 4, 4, 6, 7, 8, 11, 77]

def list_difference(list1, list2):
    """uses list1 as the reference, returns list of items not in list2"""
    diff_list = []
    for item in list1:
        if not item in list2:
            diff_list.append(item)
    return diff_list

print list_difference(list1, list2)  # [5, 9, 10]
或使用列表理解:

# simpler using list comprehension
diff_list = [item for item in list1 if item not in list2]

print diff_list    # [5, 9, 10]

从数学上讲,您正在寻找列表中表示的两个集合之间的差异。那么,使用Python集怎么样?它在-运算符上重载了一个内置的差分操作

>>> 
>>> arr = [1, 2, 3, 4, 5]
>>> arr2 = [3, 4, 9]
>>> set(arr) - set(arr2)
>>> sdiff = set(arr) - set(arr2)
>>> sdiff
set([1, 2, 5])
>>> list(sdiff)
[1, 2, 5]
>>> 

不过,首先把你的信息放在一个集合里会更方便。此操作表明,集合比列表更适合您的应用程序语义。另一方面,如果列表中可能有重复项,则set不是一个好的解决方案。

如果您关心1保留项目的显示顺序,2在列表较大的情况下保持效率,则可能需要将已经提出的两种解决方案混合使用

list2_items = set(list2)
[x for x in list1 if x not in list2_items]
将两者转换为集合将丢失顺序。在列表理解中使用if x not in list2实际上会使您在两个列表上都进行迭代,如果list2很大,这将是低效的


如果你知道list2不是很长,不需要保存每一微秒,你可能应该使用Flavius提出的简单列表理解:它很短,很简单,并且完全符合你的意思。

Plz请澄清,你想从arr1中删除arr2的对象吗?你可能在谈论列表。数组是另外的东西:甚至更漂亮:如果项目不在列表2中+1用于理解。最后你应该将结果再次转换为列表@Eli这很好,但有一个缺点,如果列表中有重复的元素,您将删除它们。也就是说,set[1,2,3,3]=set[1,2,3]。这确实取决于OP想要做什么,但必须指出。@EliBendersky:列表理解肯定比所有这些集合转换都快。根据我的经验,如果您从一开始就处理集合,那么使用集合只有在运行时才有意义,也就是说,您以前不必转换为集合。不幸的是,我们对代码的上下文不太了解。不管怎样,集合可能是解决问题的正确数据结构。@Felix:你说得对,一些测量结果显示集合的转换速度大约慢了50%,转换是双向的