- 引言
- 方法
- 解决方案1(推荐使用,速度更快)
- 解决方案2
- 实验
- 参考
列表 a 中有若干元素,列表 b 有若干元素,现要求使用 Python 3 编程,找出属于列表 a 但又不属于列表 b 的所有元素,并放到一个新定义的列表 c 里面。相当于用编程实现如下列表减法公式: c = a − b ( ∀ i ∈ c , i ∈ a , i ∉ b ) c = a - b (\forall i \in c, i \in a, i \notin b ) c=a−b(∀i∈c,i∈a,i∈/b)
方法 解决方案1(推荐使用,速度更快)先将列表转为集合,然后做减法操作:
>>> list_a = [1, 2, 3, 4, 5]
>>> list_b = [3]
>>> list_c = list(set(list_a)-set(list_b))
>>> list_c
[1, 2, 4, 5]
解决方案2
For 循环遍历列表 a,判断是否在列表 b 中:
>>> list_a = [1, 2, 3, 4, 5]
>>> list_b = [3]
>>> list_c = [i for i in list_a if i not in list_b]
>>> list_c
[1, 2, 4, 5]
实验
对于 Python 中的列表减法问题,我们有两个解决方案。很明显方案 1 要比方案 2 要简单,但当处理大列表的时候,两者的速度如何?我们写代码做一个简单的实验来看一下。
import random
import time
def test(num):
list_a = list(range(num))
list_b = random.choices(list_a, k=int(num*0.001))
def test_solution_1():
t1 = time.time()
list_c = list(set(list_a)-set(list_b))
t2 = time.time()
print(round(t2-t1, 2)) # 0.05s
def test_solution_2():
t1 = time.time()
list_c = [i for i in list_a if i not in list_b]
t2 = time.time()
print(round(t2-t1, 2)) # 14.47s
test_solution_1()
test_solution_2()
if __name__ == '__main__':
test(int(1e6))
列表 a 中有 100 万个元素,从中随机抽取 0.001 个百分比作为列表 b 中的元素,然后分别使用以上两种解决方案,计算时间。方案 1 用了 0.05 秒,方案 2 用了 14.47 秒,想必以后采用何种方案大家心里都应该清楚了。
参考https://www.cnblogs.com/python-selenium/p/3909175.html