Как перебрать список с дублирующимися значениями? - PullRequest
2 голосов
/ 13 октября 2019

Это, вероятно, очень простой вопрос, но я не знаю, что мне нужно искать, чтобы найти ответ на него:

У меня есть этот код:

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

list.append(list[0])

for i in list:
    i.append(0)

print(list)

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

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

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

Я предполагаю, что они имеют одинаковыеадрес памяти и тем самым функция добавления применяется к одному и тому же объекту по этому адресу один раз для первого индекса и один раз для последнего.

Как называется это явление? какой самый простой способ получить список, подобный этому:

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

Спасибо за вашу помощь

Ответы [ 2 ]

2 голосов
/ 13 октября 2019

Самый простой ответ - добавить 0 перед добавлением точки закрытия.

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

for i in list:
    i.append(0)

list.append(list[0])

print(list)

Это самый маленький бит, более эффективный, чем понимание списка, потому что он не делает копии элементов.

2 голосов
/ 13 октября 2019

Вы можете сделать понимание списка:

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

list.append(list[0])
list = [x + [0] for x in list]

print(list)
# [[0, 1, 0], [0, 2, 0], [1, 3, 0], [1, 4, 0], [1, 5, 0], [0, 1, 0]]

РЕДАКТИРОВАТЬ : хитрость здесь заключается в использовании x + [0] в пределах понимания списка. Таким образом создаются новые списки, таким образом, вы не добавляете 0 в один и тот же список дважды (Hattip to @dx_over_dt)

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

for i in list:
     i.append(0)
     print(i)
     print(list)

Так что для первого и последнего i в вашем цикле вы добавите 0 ктот же список. Вы можете придерживаться своего подхода, добавив копию первого элемента:

list.append(list[0].copy())
...