Неожиданный результат при использовании назначения среза во внешнем измерении во вложенных списках Python - PullRequest
0 голосов
/ 01 января 2019

При использовании следующего кода в Python 3.7.2 назначение незаметно игнорируется.Это ожидаемый результат?

>>> x = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> x
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> x[:][1]=17
>>> x
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

Есть ли лучший способ использования срезов для достижения ожидаемого результата замены второго столбца на 17?Кстати, я получаю тот же результат, когда использую [17, 17, 17] для соответствия размеру.

Редактировать: Просто чтобы избежать путаницы.Предполагаемый результат был [[1, 17, 3], [4, 17, 6], [7, 17, 9]].

Ответы [ 5 ]

0 голосов
/ 01 января 2019
list1 = [[1,2,3], [4,5,6], [7,8,9]]
x, y = len(list1)-1, 0
while y <= x:
    print(list1[y][1], end=" ")
    y = y+1

Вывод:

2 5 8

Думаю, это вам поможет

0 голосов
/ 01 января 2019

Нет смысла использовать срезы списка, если вы хотите получить результат

x = [[1, 2, 3], [17, 17, 17], [7, 8,9]]

Вы должны просто сделать:

x [1] = [17,17,17]

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

0 голосов
/ 01 января 2019

x[:] создает копию исходного списка, и этот новый список изменяется на месте.
Однако этот созданный список недоступен (так как на него нет ссылок).Если вы хотите получить второй подсписок как [17,17,17], то есть x[0] = [17 for _ in x[0]]

, но если вы хотите, чтобы он был просто [17], тогда x[0] = [17]

Редактировать: Хорошо, похожеЯ немного неправильно понял вопрос, похоже, вы хотите рассматривать это как своего рода матрицу.Для обычного списка Python и вложенных списков такого синтаксического сахара не существует, вам нужно создать цикл for:

for sublist in x:
    sublist[1] = 17

При использовании списка вы должны создать копию, которая не требуется вПервое место ИМО.Но если вы хотите это

copied_and_modified_x = [[sublist[0], 17, sublist[2]] for sublist in x]

0 голосов
/ 01 января 2019

id(x) и id(x[:]) различаются, поскольку x[:] создает поверхностную копию x.Итак, когда вы пишете

x[:][0][1] = 17

Вы создаете новую поверхностную копию x и модифицируете первый элемент первого подсписка на 17. Но результат нового результата не имеет ссылки, поэтомуне может получить доступ к его содержимому.

Вы можете сделать это, чтобы получить желаемый результат:

a = x[:] # creates a shallow copy of x
a[0][1] = 17
print(x, id(x))
print(a, id(a))

Вывод:

[[1, 17, 3], [4, 5, 6], [7, 8, 9]] 139933444652552
[[1, 17, 3], [4, 5, 6], [7, 8, 9]] 139933416357064
0 голосов
/ 01 января 2019

вы ищете это?:

x = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
y=[[l[0],17,l[2]] for l in x]
print(y)

Результат:

[[1, 17, 3], [4, 17, 6], [7, 17, 9]]
...