数组除了其他

时间:2011-04-11 09:45:19

标签: python

我有2个阵列:

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

除了arr2,我想给出数组arr1。

3 个答案:

答案 0 :(得分: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不是一个好的解决方案。

答案 1 :(得分: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]

答案 2 :(得分: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提出的简单列表理解:它简短,简单并且说出你的意思