найти последовательные целые числа в списке несортированных Python

Вы не применяете ключ к родительскому фрагменту.

Вы можете использовать <> так же, как и любой другой элемент, за исключением того, что он не поддерживает ключи или атрибуты. ~ https://reactjs.org/docs/fragments.html#short-syntax

blockquote>

Вы используете короткий синтаксис <>, который не поддерживает ключи. Использование:


      
{isValidated ? 'x' : index + 1}

3
задан 18.03.2019, 08:38

5 ответов

Это потому, что вы проверяете только следующий номер. Если вам нужен второй номер (например, 9 или 3), вы должны также включить проверку для предыдущего номера. Это сделает if немного длиннее, но это сработает.

num=[8,9,4,1,2,3]

for i in range(len(num)):
    if (
        (  # check for the next number
            i + 1 != len (num) and  # don't check the end of the list
            num[i]+1==num[i+1] 
        ) or (  # check for the previous number
            i != 0 and  # don't check before the list
            num [i-1] == num [i] - 1
        )
    ): print('Con',num[i])

Кроме того, мне пришлось убрать -1 в вашем диапазоне, потому что я уже делаю ручную проверку, и, как указывалось, это показало 3 из показа.

0
ответ дан 08.05.2019, 17:56
  • 1
    Вывод равняется 8, 9, 1, 2. Я думаю, что OP хочет 3 быть включенной. – Sanyash 18.03.2019, 08:48
  • 2
    Спасибо, я зафиксировал это (я проверил на то, что был последним элементом дважды), – Levi Lesches 18.03.2019, 08:52
  • 3
    @MichaЕ‚ спасибо Ziober, добавленная ссылка – Spara 30.03.2019, 02:29

Один из способов состоит в том, чтобы напечатать оба числа, когда вы обнаружили, что они являются последовательными, но также проверить, что номер по индексу i-1 не был в последовательном списке, так что номер по индексу i не печатается дважды:

num = [8, 9, 4, 1, 2, 3]

for i in range(len(num)-1):  # not using -1 will cause index error
    if num[i] + 1 == num[i + 1]:
        if i == 0 or (i - 1 >= 0 and num[i - 1] != num[i] - 1):
            print('Con', num[i])
        print('Con', num[i + 1])

Можно попробовать и с более сложным списком:

num = [8, 9, 4, 1, 2, 3, 4, 4, 8, 9, 1, 2, 3, 0, 1, 5, 6, 1]

for i in range(len(num)-1):  # not using -1 will cause index error
    if num[i] + 1 == num[i + 1]:
        if i == 0 or (i - 1 >= 0 and num[i - 1] != num[i] - 1):
            print('Con', num[i])
        print('Con', num[i + 1])
0
ответ дан 08.05.2019, 17:56
  • 1
    @htafoya в краткой форме, it' положение s % (который является 1 основанным индексом) тогда $ и тип данных..., где положение относится к порядку аргументов, который следует за строкой, например, при использовании String.format(). связанная документация имеет различные примеры в краткой форме и подробной форме. – Martin Zeitler 29.03.2019, 07:09
num = [8, 9, 4, 1, 2, 3]

def con(rng, pos=0):
    if pos < len(rng):
        if (pos > 0 and rng[pos]-1 == rng[pos-1]) or (pos < len(rng) -1 and rng[pos]+1 == rng[pos+1]):
            print("con", rng[pos])
        con(rng, pos+1)

con(num)

редактировать: это решение основано на параллельной функции и требует только список в качестве аргумента. Пока они находятся в пределах нижней / верхней границы списка, функция будет проверять, равны ли (предыдущее число) -1 или (следующее число) +1 (это число): con 8 con 9 con 1 con 2 con 3

0
ответ дан 08.05.2019, 17:56
  • 1
    В то время как этот код может ответить на отправленный вопрос, it' s лучше всего для включения краткого описания того, как код работает и почему you' ve сделал выбор, который Вы имеете, если это возможно. По крайней мере, образец исходных данных и их соответствующих выводов улучшил бы этот ответ. – Henry Woody 18.03.2019, 11:12
  • 2
    @htafoya полный шаблон объясняет его... % указывает, что начало строковой замены и эти $ завершает индекс аргумента. – Martin Zeitler 29.03.2019, 07:15

Вы можете использовать функцию groupby():

from itertools import groupby
from operator import sub, itemgetter

num = [8, 9, 4, 1, 2, 3]

iget = itemgetter(1)
gb = groupby(enumerate(num), key=lambda x: sub(*x))
all_groups = (list(map(iget, g)) for _, g in gb)
list(filter(lambda x: len(x) > 1, all_groups))
# [[8, 9], [1, 2, 3]]
.
0
ответ дан 08.05.2019, 17:56
  • 1
    Я понимаю часть %, но меня don' t добираются, почему эти $ необходим, я использовал с и без $ неотчетливо. Ссылка doesn' t дают любое объяснение его использования. – htafoya 29.03.2019, 07:13

Ваш код проверяется только в одном направлении (после него следует порядковый номер) Для полной последовательности вы должны проверить в обоих направлениях.

num=[8,9,4,1,2,3]

assert(len(num) > 1)
for i, n in enumerate(num):
    if i != 0:
        if n == num[i-1] + 1:
            print("Con", n)
            continue
    if i != len(num) - 1:
        if n == num[i+1] - 1:
            print("Con", n)

0
ответ дан 08.05.2019, 17:56
  • 1
    Я don' t понимают Вас, можно ли дать пример? – htafoya 29.03.2019, 06:55

Теги

Похожие вопросы