>>> a=[1,2,3,4,5,7,8,9,10]
>>> sum(xrange(a[0],a[-1]+1)) - sum(a)
6
另一种方法是使用等差数列求和公式
>>> a[-1]*(a[-1] + a[0]) / 2 - sum(a)
6
对于一般情况下可能丢失多个数字的情况,您可以制定O(n)方法。
>>> a=[1,2,3,4,7,8,10]
>>> from itertools import imap, chain
>>> from operator import sub
>>> print list(chain.from_iterable((a[i] + d for d in xrange(1, diff))
for i, diff in enumerate(imap(sub, a[1:], a))
if diff > 1))
[5, 6, 9]
应该可以正常工作:
a = [1, 3, 4, 5, 7, 8, 9, 10]
b = [x for x in range(a[0], a[-1] + 1)]
a = set(a)
print(list(a ^ set(b)))
>>> [2, 6]
set()
转换时会产生什么性能影响。遗憾的是,^
运算符只适用于集合,因此即使知道列表实际上是一个集合(尽管存储为列表),也需要进行转换。 - rbaleksandarrange(0,10)
只包括从0到9(含)的值。为了也包括10,需要将a
的最后一个值加1。当然,这并不重要,因为如果a
中缺少10,我们怎么会知道呢? - Raketenolli1 + 2 + 3 + ... + (n - 1) + n = (n) * (n + 1)/2
(a[-1] * (a[-1] + 1))/2 - sum(a)
set(range(a[len(a)-1])[1:]) - set(a)
取所有数字的集合减去给定的集合。
range(a[0],a[-1]+1)
? - steinerkelvin+1
并不重要。但我认为 range(1,a[-1])
更清晰明了。 - steinerkelvina=[1, 2, 4, 99]
。你的方法适当地处理了这个问题。 - James还有一种使用 itertools
模块的方法:
from itertools import count, izip
a=[1,2,3,4,5,7,8,9,10]
nums = (b for a, b in izip(a, count(a[0])) if a != b)
next(nums, None)
# 6
>>> a=[1,2,3,4,5,7,8,9,10]
>>> n = len(a) + 1
>>> (n*(n+1)/2) - sum(a)
6
def find(arr):
for x in range(0,len(arr) -1):
if arr[x+1] - arr[x] != 1:
print arr[x] + 1
L=[-5,1,2,3,4,5,7,8,9,10,13,55]
missing=[]
for i in range(L[0],L[-1]):
if i not in L:
missing.append(i)
print(missing)
def findAllMissingNumbers(a):
b = sorted(a)
return list(set(range(b[0], b[-1])) - set(b))
>>> a=[1,2,3,4,5,7,8,10]
>>> [(e1+1) for e1,e2 in zip(a, a[1:]) if e2-e1 != 1]
[6, 9]
e2-e1 != 1
。 - thefourtheyea=[1,2,3,4,5,8,10]
,那会怎样? - Abhijit