2011-04-11 23 views
-1

我有2个数组:阵列除了其它

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

我想给阵列ARR1除了ARR2。

+0

Plz be clear您是否想从arr1中删除arr2的对象 – 2011-04-11 09:47:11

+0

您可能正在讨论**列表**。数组是其他东西:http://docs.python.org/library/array.html – 2011-04-11 09:52:39

回答

2

所以,你要两个列表的区别:

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] 
+0

更漂亮:“如果项目不在列表2中”。 +1为理解。 – 2011-04-11 09:47:59

+0

谢谢,修正:-) – Flavius 2011-04-11 09:54:29

3

数学上来说,你正在寻找清单表示的两组之间的差异。那么如何使用Python set,它有一个内置的差异操作(在-操作符上超载)?

>>> 
>>> 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的位置会更方便。此操作表明set更适合您的应用程序语义,而不是list。另一方面,如果列表中可能有重复项,则set不是一个好的解决方案。

+0

最后,你应该将结果再次转换为列表; – plaes 2011-04-11 09:54:47

+0

我的口味转换太多... – Flavius 2011-04-11 09:56:08

+0

@plaes:谢谢,已完成 – 2011-04-11 09:56:36

2

如果您关心的是(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提出的简单列表理解:简短,简单,并且确切地说明了你的意思。

+0

大输入,+1 – Flavius 2011-04-11 10:00:24