Я пытаюсь отделить каждый непрерывный сегмент последовательных чисел в другом массиве. Например,

# Input
x=[1,2,3,4,5,8,11,12,13,18]
# Output:
x=[[1,2,3,4,5],[8],[11,12,13],[18]]

Существующий код,

x=[1,2,3,4,5,8,11,12,13,18]
temp=[]

firstnumber=0
for i in range(1,len(x)-1,1):
    current=x[i]
    previous=x[i-1]
    if ((current-previous)!=1):
        mm=(x[firstnumber:i-1])
        temp.append(mm)
        firstnumber=x[i]
print(temp)


Я получил только [[1, 2, 3, 4], []] в результате, и я не могу понять, почему.

1
user2241397 5 Июл 2019 в 21:16

4 ответа

Лучший ответ
x=[1,2,3,4,5,8,11,12,13,18]
x.append(x[-1]-2)
temp=[]

firstnumber=0
for i in range(1, len(x)):
    current=x[i]
    previous=x[i-1]
    if ((current-previous)!=1):
        mm=(x[firstnumber:i])
        temp.append(mm)
        firstnumber=i
print(temp)
0
tpain 5 Июл 2019 в 18:35

Мой ответ не предназначен для предоставления исправленного кода, а скорее для выполнения описанной задачи. Обратите внимание, что вы можете использовать индекс -1, означающий последний элемент. Я бы сделал это следующим образом

x=[1,2,3,4,5,8,11,12,13,18]
temp=[x[:1]]
for i in x[1:]:
    if temp[-1][-1]+1!=i: temp.append([])
    temp[-1].append(i)
print(temp)

Выход:

[[1, 2, 3, 4, 5], [8], [11, 12, 13], [18]]

Объяснение: Сначала я загружаю первый элемент как одноэлементный список, затем для следующих элементов, если есть разница, отличная от 1, между текущим и последним увиденным элементом, тогда я добавляю новый пустой список к temp, затем независимо от полного заполнения или отсутствия условия Я добавляю текущий элемент в последний подсписок.

1
Daweo 5 Июл 2019 в 18:43

Я попытался ответить на этот вопрос, изменив как можно меньше вашего кода.

x=[1,2,3,4,5,8,11,12,13,18]
temp=[]

firstnumber=0
first_index = 0
for i in range(1, len(x)):
    current=x[i]
    previous=x[i-1]
    if ((current-previous)!=1):
        mm = x[first_index:i]
        temp.append(mm)
        firstnumber = x[i]
        first_index = i

temp.append(x[first_index:])

print(temp)  # [[1, 2, 3, 4, 5], [8], [11, 12, 13], [18]]

Что я изменил: firstnumber используется в качестве индекса, но на самом деле это элемент списка, поэтому нам нужно использовать first_index = i, текущий индекс на этой итерации.

Цикл не охватывал все элементы списка, нам нужно пройти весь путь до конца списка, поэтому мы перебираем range(1, len(x)

Наконец, даже если цикл завершится, будет отсутствовать последняя последовательность, если мы не добавим ее после цикла, следовательно, добавление temp.append(x[first_index:])

ПРИМЕЧАНИЕ. Этот метод будет работать с входными данными, которые у вас есть, но он не является надежным для всех случаев, и при этом он не является наиболее эффективным способом сделать это, однако, ваш вопрос заключался в том, почему он не сработал, так как, надеюсь, он на это ответит.

1
Alex 5 Июл 2019 в 18:38

Я полагаю, что в коде переменная firstnumber должна содержать индекс первого элемента любого непрерывного сегмента последовательных чисел.

Однако, когда вы делаете firstnumber=x[i], эта цель теряется. Вместо этого вы можете сделать firstnumber = i, и тогда это сработает.

Кроме того, эта реализация не будет добавлять последний последовательный сегмент. В результате вам придется делать это вне цикла.

-1
ranka47 5 Июл 2019 в 18:33