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

时间:2013-12-21 11:05:44

标签: python

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

a=[1,2,3,4,5,7,8,9,10]

我遇到过这个post,但有更简单有效的方法吗?

18 个答案:

答案 0 :(得分:17)

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

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

>>> 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]

答案 1 :(得分: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]

答案 2 :(得分:8)

1 + 2 + 3 + ... + (n - 1) + n = (n) * (n + 1)/2

所以缺少的号码是:

(a[-1] * (a[-1] + 1))/2 - sum(a)

答案 3 :(得分:7)

set(range(a[len(a)-1])[1:]) - set(a)

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

答案 4 :(得分: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

答案 5 :(得分:2)

这将处理缺少第一个或最后一个号码的情况。

>>> a=[1,2,3,4,5,7,8,9,10]
>>> n = len(a) + 1
>>> (n*(n+1)/2) - sum(a)
6

答案 6 :(得分:1)

如果列表中有许多缺失的数字:

>>> 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]

答案 7 :(得分:1)

def find(arr):
        for x in range(0,len(arr) -1):
                if arr[x+1] - arr[x] != 1:
                        print arr[x] + 1

答案 8 :(得分:1)

这是在列表中查找错误号码的简单逻辑。

plt.figure()
plt.plot(P[:, 0], P[:, 1])
plt.plot(Q[:, 0], Q[:, 1])
plt.show()

答案 9 :(得分:0)

如果范围已知并给出列表,则以下方法将起作用。

a=[1,2,3,4,5,7,8,9,10]
missingValues = [i for i in range(1, 10+1) if i not in a]
print(missingValues)

# o/p: [6] 

答案 10 :(得分:0)

def findAllMissingNumbers(a): b =已排序(a) 返回列表(set(range(b [0],b [-1])-set(b))

答案 11 :(得分:0)

import random
s = random.sample(range(1,20),16)
s.sort()
a = 1
last = []
for i in range(1,len(s)+1,1):
    if a not in s:
        last.append(a)
        a +=1
    else:
        a +=1
print(last)

这个是带循环的,它也可以搜索多个或单个遗漏的号码

答案 12 :(得分:0)

对于非常大的列表而言效率较低,但这是我的Sum公式版本:

def missing_number_sum(arr):
    return int((arr[-1]+1) * arr[-1]/2) - sum(arr)

答案 13 :(得分:0)

上述问题的简单解决方案,它还会发现多个缺少的元素。

a = [1,2,3,4,5,8,9,10]
missing_element = []
for i in range(a[0], a[-1]+1):
    if i not in a:
        missing_element.append(i)

print missing_element

o / p: [6,7]

答案 14 :(得分:0)

@Abhiji有一个完美的解决方案。我想通过定义粒度值的选项来扩展他的答案。如果应检查列表是否缺少value > 1

,则可能需要这样做
from itertools import imap, chain
from operator import sub

granularity = 3600
data = [3600, 10800, 14400]

print list(
  chain.from_iterable(
    (data[i] + d for d in xrange(1, diff) if d % granularity == 0) 
      for i, diff in enumerate(imap(sub, data[1:], data)) 
        if diff > granularity
  )
)

上面的代码会产生以下输出:[7200]

由于这段代码使用了很多嵌套函数,我还想提供一个快速反向引用,这有助于我理解代码:

答案 15 :(得分:0)

我使用了索引位置。 这样我就可以比较指数和价值。

a=[0,1,2,3,4,5,7,8,9,10]

for i in a:
  print i==a.index(i)

答案 16 :(得分:0)

一种简单的列表理解方法,可以处理多个(非连续的)缺失数字。

def find_missing(lst):
    """Create list of integers missing from lst."""
    return [lst[x] + 1 for x in range(len(lst) - 1) 
            if lst[x] + 1 != lst[x + 1]]

答案 17 :(得分:-1)

set(range(1,a[-1])) | set(a)

计算两组的并集。