Вставка элементов в список в Python

У меня есть список x0. Я хочу вставить индексы в соответствии с элементами missing_values. Представляю текущий и ожидаемый результат.

x0 = [1, 2, 3, 4, 5]
missing_values = [2, 4]  # indices to set to zero

# Create a set of indices from missing_values
indices_to_set_zero = set(missing_values)

# Initialize the result list
result = []

# Iterate through x0
for i, value in enumerate(x0):
    # If the index is in the set, append 0 before the value
    if i in indices_to_set_zero:
        result.append(0)
    result.append(value)

# If the last index is in the set, append a 0 at the end
if len(x0) in indices_to_set_zero:
    result.append(0)

print(result)

Текущий выход

[1, 2, 0, 3, 4, 0, 5]

Ожидаемый результат

[1, 0, 2, 0, 3, 4, 5]

Вы забыли отрегулировать положение вставки из-за вставки...

oOosys 30.04.2024 13:58

Я думаю, что ожидаемый результат должен быть [1, 0, 2, 3, 0, 4, 5] согласно вашему объяснению

flash 30.04.2024 13:59

переверните цикл: for i, value in reversed(enumerate(x0))

Jean-François Fabre 30.04.2024 14:08

Там написано, что необратимо.

user23495528 30.04.2024 14:10

@user23495528 user23495528 Можете ли вы разъяснить требование «Если последний индекс есть в наборе, добавить 0 в конце», желательно на примере?

matszwecja 30.04.2024 14:40
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
5
122
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

Создайте список по ходу дела и проверьте, соответствует ли текущее количество элементов индексу, содержащемуся в отсутствующих значениях:

x0 = [1, 2, 3, 4, 5]
missing_values = {2, 4, 5, 7}

out = []

for el in x0:
    while len(out)+1 in missing_values:
        out.append(0)
    out.append(el)
#to handle indexes at the end
while len(out)+1 in missing_values:
    out.append(0)
print(out) # [1, 0, 2, 0, 0, 3, 0, 4, 5]

(необходимо добавить 1 к len(out), поскольку списки индексируются с 0)

Это необходимо будет расширить для случая, когда последний индекс находится в наборе, например. missing_values = {2, 7}, что кажется важным, судя по последним строкам исходного вопроса.

Nyps 30.04.2024 14:25

@Nyps Устранено это, а также исправлена ​​проблема, если должны быть последовательные индексы, в которых нужно поставить 0.

matszwecja 30.04.2024 14:39

А как насчет вывода для x0 = [1, 2, 3, 4, 5, 6, 7 ]?

oOosys 30.04.2024 15:34
x0 = [1, 2, 3, 4, 5, 6, 7 ], missing_values = {2, 4, 5, 7, 9, 10,11,12,13,14,15,16,17,19, 21, 24} дает интересный результат: [1, 0, 2, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 6, 0, 7]
oOosys 30.04.2024 15:39

@Клаудио Как ты думаешь, что должно быть?

matszwecja 30.04.2024 15:51

Неизвестно, что должно быть. ОП не указал, как обрабатывать крайние случаи, из-за чего плохой вопрос оставляет много места для преднамеренной интерпретации. Кажется, ОП все равно не заботится.

oOosys 30.04.2024 16:02

Ваш код не соответствует требованию в коде вопроса о добавлении нуля в конце последовательности, но ваш ответ принимается единицей, так что... неважно... кажется, это не имеет значения...

oOosys 30.04.2024 16:15

Поскольку списки индексируются с 0 вам нужно вычесть 1, чтобы оно закончилось индексами 1 и 3

Также мы делаем копию x0, чтобы не нарушать индексацию с помощью перечисления.

и мы вставляем 0 только в позиции, которые необходимо вставить, без необходимости проходить полный цикл

x0 = [1, 2, 3, 4, 5]
missing_values = [2, 4]


result = x0[:]


for i, position in enumerate(missing_values):
    # Convert 1-based position to 0-based index and adjust for previous insertions
    index_to_insert = position - 1
    # Insert zero at the calculated index
    result.insert(index_to_insert, 0)

print(result)

Как сказал @user24803130, списки Python имеют нулевой индекс. Если вы хотите, чтобы ваши индексы начинались с 1, вам придется вычесть это значение. Вы можете использовать функцию insert списка:

x0 = [1, 2, 3, 4, 5]
missing_values = [2, 4]  # indices to set to zero

for i in missing_values:
    x0.insert(i-1, 0)

print(x0)

Это даст вам ожидаемый результат:

[1, 0, 2, 0, 3, 4, 5]

Обратите внимание: этот код предполагает, что отсутствующие значения будут представлять собой упорядоченный список. Если это не так, вы можете заменить missing_values в цикле for на sorted(missing_values).

Кажется, у вас есть две проблемы в коде.

Во-первых, списки имеют 0-индекс, то есть первая позиция в списке — list[0], а не list[1]. Это можно легко исправить в вашем коде:

x0 = [1, 2, 3, 4, 5]
missing_values = [2, 4]  # indices to set to zero

# Create a set of indices from missing_values
indices_to_set_zero = set(missing_values)

# Initialize the result list
result = []

# Iterate through x0
for i, value in enumerate(x0):
    # If the index is in the set, append 0 before the value
    if (i + 1) in indices_to_set_zero: # (i + 1) to account for 0-indexing
        result.append(0)
    result.append(value)

# If the last index is in the set, append a 0 at the end
if len(x0) in indices_to_set_zero:
    result.append(0)

print(result)

Альтернативой этому способу может быть просто установка правильных индексов в missing_values.

Во-вторых, поскольку вы добавляете 0 к result, ваши последующие добавления компенсируются. Это можно решить, изменив макет цикла for, попробуйте этот код:

x0 = [1, 2, 3, 4, 5]
missing_values = [2, 4]  # indices to set to zero

# Create a set of indices from missing_values
indices_to_set_zero = set(missing_values)

# Initialize the result list
result = []

# Iterate through len(x0) + len(missing_values)
x0_index = 0
for i in range(len(x0) + len(missing_values)):
    # Either append a zero or append from the x0 list
    if (i + 1) in indices_to_set_zero:
        result.append(0)
    else:
        result.append(x0[x0_index])
        x0_index += 1

print(result)

Обратите внимание, что это также избавит вас от проверки последнего индексированного нуля.

Надеюсь, это даст вам некоторое руководство

Второе решение может быть короче, если вместо индекса вы используете итератор.

no comment 30.04.2024 14:52

Вам не нужно перебирать сам список. Итерации точек вставки будет достаточно:

x0 = [1, 2, 3, 4, 5, 6, 7 ]
missing_values = [2, 4, 5, 7, 9, 10,11,12,13,14,15,16,17,19, 21, 24]

# Create a set of indices from missing_values
indices_to_set_zero = sorted(missing_values)

# Make sure it contains only valid indices: 
while  indices_to_set_zero[-1] > len(x0):
    indices_to_set_zero.pop()

# Initialize the result list
result = x0[:] # copy the original list

# If the last index is missing append a 0 at the end
if indices_to_set_zero[-1]==len(x0):
    result.append(0) 
    #indices_to_set_zero.pop()

for index in indices_to_set_zero :
    result.insert(index - 1, 0)

print(result)

дает:

[1, 0, 2, 0, 0, 3, 0, 4, 5, 6, 7, 0]

sorted() следит за тем, чтобы список пропущенных значений начинался с наименьшего значения, а последующие значения увеличивались. Без отсортированного списка пропущенных значений алгоритм даст неправильные результаты.

if indices_to_set_zero[-1]==len(x0): гарантирует, что вы добавляете после последнего элемента в списке, а не перед ним. pop() следит за тем, чтобы последнее пропущенное значение было удалено из списка пропущенных.


Обратите внимание, что код matszwecja напечатает:

[1, 0, 2, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 6, 0, 7]

Какое поведение является ожидаемым и требуемым, неизвестно, поскольку в вопросе об обработке крайних случаев нет информации. Если требуется добавление нулей в любую указанную позицию, то код matszwecja не заполняет последовательность до места размещения нулей.

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

Другие вопросы по теме