#python #list #insert
#python #Список #вставить
Вопрос:
matrix1
это список списков. Мой код проверяет matrix1[i][5]
matrix1[i 1][5]
, содержат ли и последовательные числа. Если да, то ок, если нет, вставьте новый список в i 1, копирующий предыдущий, и измените matrix1[i 1][5]
значение, увеличив его на 1. Это идея, на мой взгляд, но в реальном мире код не работает. If matrix1[i][5]=1
и matrix1[i 1]=4
мой код должны добавить 2 списка после первого и до matrix1[i 1]
и изменить номер, чтобы в конце у меня не было отверстия между 1 и 4, но все последовательные числа и результаты должны быть для 1 2 3 4. Но с моим кодом результат равен 3 3 3 4.. Кто-нибудь может мне помочь?
for i in range(0, len(matrix1)-1):
if int(matrix1[i][5])==int(matrix1[i 1][5])-1:
continue
else:
matrix1.insert(i 1, matrix1[i])
matrix1[i 1][5]=int(matrix1[i][5]) 1
Комментарии:
1. @PranavHosangadi я не понимаю ваш запрос… Мой код проверяет
matrix1[i][5]
matrix1[i 1][5]
, содержат ли и последовательные числа. Если да, то ок, если нет, вставьте новый список, соответствующий предыдущему, и изменитеmatrix1[i 1][5]
его, увеличив его на 1. Это идея, на мой взгляд, но в реальном мире код не работает. Ifmatrix1[i][5]=1
иmatrix1[i 1]=4
мой код должны добавить 2 списка после первого и доmatrix1[i 1]
и изменить номер, чтобы в конце у меня не было отверстия между 1 и 4, но все последовательные числа и результаты должны быть для 1 2 3 4. Но с моим кодом результат равен 3 3 3 4…2. Теперь это редактирование достаточно понятно
Ответ №1:
Я вижу две проблемы:
-
Когда у вас есть список
a = [0, 1]
и, скажемb = a; b[0] = 100; print(a[0])
, вы все равно получаете вывод100
. Почему? Потому что присвоение списка переменной в Python не копирует этот список!Вместо этого он заставляет новую переменную ссылаться на ту же память, что и старая, так что изменение одной из них изменяет их все. Это ошибка, которую вы допустили здесь :matrix1.insert(i 1, matrix1[i])
. Вы можете создать копию несколькими способами. Я собираюсь выполнить итерацию по списку, используя понимание списка, просто так:b = [x for x in a]
-
Это плохая идея изменять список (вставлять / удалять элементы) внутри цикла for, который перебирает список. Вместо этого лучше создать новый список, содержащий все значения, которые вас интересуют.
Предположим, у вас есть matrix1
такой:
matrix1 = [[0, 1, 2, 3, 4, 1],
[0, 1, 2, 3, 4, 4],
[0, 1, 2, 3, 4, 5],
[0, 1, 2, 3, 4, 10],
[0, 1, 2, 3, 4, 11]]
Теперь давайте определим другой список matrix2
, который пока будет пустым
matrix2 = []
Теперь мы собираемся скопировать каждую строку в новую матрицу. И если matrix1[i][5]
и matrix1[i 1][5]
не являются последовательными, мы также собираемся вставить все необходимые новые строки в новую матрицу.
for i in range(0, len(matrix1)-1):
row = matrix1[i]
matrix2.append([x for x in row])
if int(matrix1[i][5])==int(matrix1[i 1][5])-1:
continue
else:
# Add rows from [i][5] 1 to less than [i 1][5]
# The third argument handles the case when [i 1][5] is less than [i][5]
for j in range(matrix[i][5] 1, matrix1[i 1][5], (1 if matrix1[i 1][5] > matrix[i][5] else -1)):
newrow = [x for x in row]
newrow[5] = j # Set col 6
matrix2.append(newrow) # Add another row
# Finally, append the last row
matrix2.append([x for x in matrix1[-1]])
print(matrix2)
Это дает результат:
[[0, 1, 2, 3, 4, 1],
[0, 1, 2, 3, 4, 2],
[0, 1, 2, 3, 4, 3],
[0, 1, 2, 3, 4, 4],
[0, 1, 2, 3, 4, 5],
[0, 1, 2, 3, 4, 6],
[0, 1, 2, 3, 4, 7],
[0, 1, 2, 3, 4, 8],
[0, 1, 2, 3, 4, 9],
[0, 1, 2, 3, 4, 10],
[0, 1, 2, 3, 4, 11]]
Или, более простой способ: мы можем просто избавиться от проверки последовательности и просто иметь for j
цикл, поэтому мы вставляем столько строк, сколько необходимо, чтобы перейти от matrix1[i][5]
к matrix1[i 1][5]
. Если они будут последовательными, мы в конечном итоге вставим только одну строку.
for i in range(0, len(matrix1)-1):
row = matrix1[i]
# In this case, we also want to add the [i][5] row.
# Add rows from [i][5] to less than [i 1][5]
for j in range(matrix1[i][5], matrix1[i 1][5], (1 if matrix1[i 1][5] > matrix1[i][5] else -1)):
newrow = [x for x in row]
newrow[5] = j # Set col 6
matrix2.append(newrow) # Add another row
# Finally, append the last row
matrix2.append([x for x in matrix1[-1]])