如何从列表中找到丢失的号码?

Raj*_*eev 16 python

如何从排序列表中找到pythonic方式中缺少的数字

a=[1,2,3,4,5,7,8,9,10]
Run Code Online (Sandbox Code Playgroud)

我遇到过这篇文章,但有更简单有效的方法吗?

Abh*_*jit 17

>>> a=[1,2,3,4,5,7,8,9,10]
>>> sum(xrange(a[0],a[-1]+1)) - sum(a)
6
Run Code Online (Sandbox Code Playgroud)

或者(使用AP系列公式的总和)

>>> a[-1]*(a[-1] + a[0]) / 2 - sum(a)
6
Run Code Online (Sandbox Code Playgroud)

对于可能缺少多个数字的一​​般情况,您可以制定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]
Run Code Online (Sandbox Code Playgroud)

  • 问题是"如何找到缺失的数字"而不是"如何找到错误的数字" (3认同)
  • 仅当缺少一个数字时,此方法才有效 (2认同)

小智 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]
Run Code Online (Sandbox Code Playgroud)


Gab*_*iel 8

1 + 2 + 3 + ... + (n - 1) + n = (n) * (n + 1)/2
Run Code Online (Sandbox Code Playgroud)

所以缺少的数字是:

(a[-1] * (a[-1] + 1))/2 - sum(a)
Run Code Online (Sandbox Code Playgroud)


Saš*_*jak 7

set(range(a[len(a)-1])[1:]) - set(a)
Run Code Online (Sandbox Code Playgroud)

取所有数字的集合减去给定的集合.


Jon*_*nts 7

另一种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
Run Code Online (Sandbox Code Playgroud)