Список списков и вставка

#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. Это идея, на мой взгляд, но в реальном мире код не работает. If matrix1[i][5]=1 и matrix1[i 1]=4 мой код должны добавить 2 списка после первого и до matrix1[i 1] и изменить номер, чтобы в конце у меня не было отверстия между 1 и 4, но все последовательные числа и результаты должны быть для 1 2 3 4. Но с моим кодом результат равен 3 3 3 4…

2. Теперь это редактирование достаточно понятно

Ответ №1:

Я вижу две проблемы:

  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]

  2. Это плохая идея изменять список (вставлять / удалять элементы) внутри цикла 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]])