Как найти пропущенный номер из списка?

Как найти недостающее число из отсортированного списка pythonic way

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

Я столкнулся с этим сообщением , но есть ли более простой и эффективный способ сделать это?

Ответ 1

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

Ответ 2

Это должно работать:

    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]

Ответ 3

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

так что недостающее число:

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

Ответ 4

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

Возьмем множество всех чисел за вычетом набора заданных.

Ответ 5

И еще один способ 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

Ответ 6

Это будет обрабатывать случаи, когда отсутствует первый или последний номер.

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

Ответ 7

Если в списке осталось несколько отсутствующих номеров:

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

Ответ 8

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

Ответ 9

Вот простая логика для поиска чисел в списке.

l=[-10,-5,2,4,5,9,20]
s=l[0]
e=l[-1]
x=sorted(range(s,e+1))
l_1=[]
for i in x:
    if i not in l:
        l_1.append(i)
print(l_1)

Ответ 10

Простой подход к пониманию списка, который будет работать с несколькими (непоследовательными) недостающими числами.

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

Ответ 11

Я использовал позицию индекса. таким образом я сравниваю индекс и значение.

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

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

Ответ 12

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

Поскольку этот фрагмент кода использует много вложенных функций, я также хотел бы предоставить краткую обратную ссылку, которая помогла мне понять код:

Ответ 13

Простое решение для вышеуказанной проблемы, он также находит несколько недостающих элементов.

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

о/п: [6,7]

Ответ 14

Менее эффективен для очень больших списков, но здесь моя версия для формулы суммы:

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

Ответ 15

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)

ну этот с циклом, а также он ищет несколько или одно пропущенное число

Ответ 16

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

Вычислить объединение двух множеств.