#python #list #copy
#python #Список #Копировать
Вопрос:
Мне нужен список списков, где первые два подсписка введены вручную, но с третьего по пятый список являются копиями друг друга. Как я могу добиться того, чтобы мне приходилось писать один и тот же список три раза? Этот пример не то, что я хочу, но вместо этого создает третий подсписок, который в три раза длиннее, чем мне нужно:
examplelist=[[1,2],[3,4],3*[5,6,7]]
>>>[[1, 2], [3, 4], [5, 6, 7, 5, 6, 7, 5, 6, 7]]
Я хочу:
>>>[[1, 2], [3, 4], [5, 6, 7], [5, 6, 7], [5, 6, 7]]
Комментарии:
1. @sweeneyrod смотрите мой комментарий к ответу mhawke — это не очень хорошая идея.
2. @jonrsharpe вы правы, но, честно говоря, в OP не сказано, имеет ли это значение или нет.
3. @mhawke операционная система вполне может не знать, что это может быть проблемой. Множественные ссылки на изменяемые объекты — довольно распространенная «ошибка» Python, которая сбивает с толку множество новых пользователей и вызывает незначительные ошибки — ваш ответ, по крайней мере, дает понять, что это так.
Ответ №1:
Вероятно, вам лучше всего сделать это простым способом:
l = [[1, 2], [3, 4]]
l.extend([5, 6, 7] for _ in range(3))
Если вы умножите список списков ( [[5, 6, 7]] * 3 == [[5, 6, 7], [5, 6, 7], [5, 6, 7]]
), то в итоге получите три ссылки на один и тот же список.
Комментарии:
1. Забыл упомянуть, что у меня есть другие списки, следующие за тремя идентичными списками …. но ваш ответ в сочетании с плюсами отлично работает! Спасибо!
2. В шутку, сколько ввода это сэкономило? Ввод полного списка:
len('l = [[1, 2], [3, 4], [5, 6, 7], [5, 6, 7], [5, 6, 7]]')
=> 53 — вместо len(‘l = [[1, 2], [3, 4]]; l.расширить([5, 6, 7] для _ в диапазоне(3))’ => 58.3. @mhawke в данном случае очень мало! Однако это снижает риск ошибки (поскольку вы не выписываете один и тот же список несколько раз) и лучше масштабируется при изменении
n
.
Ответ №2:
Пара способов:
>>> [[1,2],[3,4]] [[5,6,7]]*3
[[1, 2], [3, 4], [5, 6, 7], [5, 6, 7], [5, 6, 7]]
или
>>> examplelist=[[1,2],[3,4]]
>>> examplelist.extend([[5,6,7]]*3)
>>> examplelist
[[1, 2], [3, 4], [5, 6, 7], [5, 6, 7], [5, 6, 7]]
Но обратите внимание, что последние 3 списка в списке будут одинаковыми:
>>> examplelist[-1][0] = 100
>>> examplelist
[[1, 2], [3, 4], [100, 6, 7], [100, 6, 7], [100, 6, 7]]
вероятно, это не то, что вы хотите.
Комментарии:
1. Попробуйте использовать любой из этих результатов
examplelist[2][1] = 9
и посмотрите, к чему это приведет…2. Спасибо, уже знал, что редактировал его… но ваш способ кажется лучше.
Ответ №3:
Python добавит списки, чтобы получить то, что вы ожидаете:
>>> examplelist=[[1,2],[3,4]]
>>> n=3
>>> examplelist =[[5,6,7] for i in range(n)]
>>> examplelist
[[1, 2], [3, 4], [5, 6, 7], [5, 6, 7], [5, 6, 7]]
Вы также можете создать структуру, описанную за один раз, поскольку выражения вычисляются по мере построения списка:
>>> li=[[1,2,3]] [[5,6,7] for i in range(n)] [[7,8,9]]
>>> li
[[1, 2, 3], [5, 6, 7], [5, 6, 7], [5, 6, 7], [7, 8, 9]]
Комментарии:
1. Обратите внимание, что ваша вторая версия помещает список списков в
li[1]
, они не встроены в запросы OP.2. @jonrsharpe: спасибо! исправлено. все еще вытираю сон с моих глаз!
Ответ №4:
Это должно сработать:
>>> from itertools import repeat
>>> ex = [ [1,2], [3,4] ]
>>> ex.extend(repeat([5, 6, 7], 3))
>>> ex
>>> [[1, 2], [3, 4], [5, 6, 7], [5, 6, 7], [5, 6, 7]]
Комментарии:
1. зачем голосовать за это, когда это дает необходимый результат?
2. Это связано с той же проблемой, что и ответы @mhawke — вы получаете три ссылки на один и тот же объект списка .
3. @jonrsharpe спасибо за этот полезный совет, три ссылки фактически меняются, когда изменяется только 1 элемент. Однако я думаю, что их попытка достаточно хороша.