У меня есть список 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]
Я думаю, что ожидаемый результат должен быть [1, 0, 2, 3, 0, 4, 5]
согласно вашему объяснению
переверните цикл: for i, value in reversed(enumerate(x0))
Там написано, что необратимо.
@user23495528 user23495528 Можете ли вы разъяснить требование «Если последний индекс есть в наборе, добавить 0 в конце», желательно на примере?
Создайте список по ходу дела и проверьте, соответствует ли текущее количество элементов индексу, содержащемуся в отсутствующих значениях:
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 Устранено это, а также исправлена проблема, если должны быть последовательные индексы, в которых нужно поставить 0.
А как насчет вывода для x0 = [1, 2, 3, 4, 5, 6, 7 ]
?
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]
@Клаудио Как ты думаешь, что должно быть?
Неизвестно, что должно быть. ОП не указал, как обрабатывать крайние случаи, из-за чего плохой вопрос оставляет много места для преднамеренной интерпретации. Кажется, ОП все равно не заботится.
Ваш код не соответствует требованию в коде вопроса о добавлении нуля в конце последовательности, но ваш ответ принимается единицей, так что... неважно... кажется, это не имеет значения...
Поскольку списки индексируются с 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)
Обратите внимание, что это также избавит вас от проверки последнего индексированного нуля.
Надеюсь, это даст вам некоторое руководство
Второе решение может быть короче, если вместо индекса вы используете итератор.
Вам не нужно перебирать сам список. Итерации точек вставки будет достаточно:
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 не заполняет последовательность до места размещения нулей.
Поскольку требование размещения нуля в конце сгенерированной последовательности не рассматривается в принятом ответе, в отличие от кода, предлагающего это в коде вопроса, это требование не является необходимым.
Вы забыли отрегулировать положение вставки из-за вставки...