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%,转换是双向的