создание списка n копий списков

#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 элемент. Однако я думаю, что их попытка достаточно хороша.