如何在Python中合并或连接两个不重叠的列表?
首先,我为我的词汇不准确而道歉。我还是个完全的新手。无论如何,我正在尝试解决这个问题: http://projecteuler.net/problem=1
简单来说,我想写一个程序,找出所有小于1000的3或5的倍数的总和。
我(非常基础)的做法是用这个程序:
##Multiples of 3
x = range(3, 1000, 3)
##Multiples of 5
y = range(5, 1000, 5)
a = sum(x)
b = sum(y)
n = a + b
print n
我意识到这样做是错的,因为像15这样的数字被计算了两次(它是3和5的倍数)。那么有没有办法解决这个问题,或者我是不是从一个完全错误的角度在看待这个问题?还是我需要在尝试解决这个问题之前多学习一些?如果之前的帖子已经解释过这个问题,我也很抱歉,但我找了一下没有找到。
6 个回答
2
4
你可以使用一个 set
来去掉重复的元素:
>>> len(x)
333
>>> len(y)
199
>>> s = set(x + y)
>>> len(s)
532
然后你可以直接对这个集合里的元素进行 sum
操作。
4
这个叫做包含-排除原理,所以你可以这样做:
##Multiples of 3
x = range(3, 1000, 3)
##Multiples of 5
y = range(5, 1000, 5)
##multiple of 15 are counted twice
z=range(15,1000,15)
a = sum(x)
b = sum(y)
c = sum(z)
n = a + b -c
print(n)
但更有趣的是使用生成器或者列表推导式。
a = sum(i for i in range(1000) if i%3 == 0 or i%5 == 0 )
print(a)
这里的 % 是 取模运算,就是整数除法的余数。这个方法的好处在于代码读起来很流畅,直接对应规则,从左到右都能理解。
这两种算法的运行时间都和 n 有关,这里 n 是 1000。如果 n 比如是 1000000000,那你得等很久才能完成。如果你稍微用点数学知识,就能发现:
sum(a for a in range(a1,a2,n))
其实是 等差数列,这个总和可以在固定的时间内计算出来,无论 n 有多大。 http://en.wikipedia.org/wiki/Project_Euler#Example_problem_and_solutions