我有2个阵列:
arr1 = [a,b,c,d,e]
arr2 = [c,d,e]
除了arr2,我想给出数组arr1。
答案 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提出的简单列表理解:它简短,简单并且说出你的意思