2011-04-11 21 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