Создание списка в Python с несколькими копиями данного объекта в одной строке - PullRequest
20 голосов
/ 07 мая 2010

Предположим, у меня есть данный Объект (строка "a", число, скажем, 0 или список ['x','y'])

Я хотел бы создать список, содержащий много копий этого объекта,но без использования цикла for:

L = ["a", "a", ... , "a", "a"]

или

L = [0, 0, ... , 0, 0]

или

L = [['x','y'],['x','y'], ... ,['x','y'],['x','y']]

Меня особенно интересует третий случай.Спасибо!

Ответы [ 4 ]

39 голосов
/ 07 мая 2010

Вы можете использовать оператор *:

L = ["a"] * 10
L = [0] * 10
L = [["x", "y"]] * 10

Будьте осторожны, создайте N копий того же элемента , что означает, что в третьем случае вы создаете список, содержащий N ссылок на список ["x", "y"]; например, изменение L[0][0] изменит и все остальные копии:

>>> L = [["x", "y"]] * 3
>>> L
[['x', 'y'], ['x', 'y'], ['x', 'y']]
>>> L[0][0] = "z"
[['z', 'y'], ['z', 'y'], ['z', 'y']]

В этом случае вы можете использовать понимание списка:

L = [["x", "y"] for i in range(10)]
30 голосов
/ 07 мая 2010

itertools.repeat() - ваш друг.

L = list(itertools.repeat("a", 20)) # 20 copies of "a"

L = list(itertools.repeat(10, 20))  # 20 copies of 10

L = list(itertools.repeat(['x','y'], 20)) # 20 copies of ['x','y']

Обратите внимание, что в третьем случае, поскольку списки ссылаются по ссылке, изменяется один экземпляр ['x', 'y '] в списке изменит их все, поскольку все они ссылаются на один и тот же список.

Чтобы не ссылаться на один и тот же элемент, вместо этого можно использовать понимание для создания новых объектов для каждого элемента списка:

L = [['x','y'] for i in range(20)]

(Для Python 2.x используйте xrange() вместо range() для производительности.)

2 голосов
/ 07 мая 2010

Вы могли бы сделать что-то вроде

x = <your object>
n = <times to be repeated>
L = [x for i in xrange(n)]

Заменить диапазон (n) для Python 3.

0 голосов
/ 02 марта 2017

Если вы хотите уникальные экземпляры и любите гольф , это (немного) короче:

L = [['x', 'y'] for _ in []*10]

Сумасшедшая вещь в том, что это также (заметно) быстрее:

>>> timeit("[['x', 'y'] for _ in [0]*1000]", number=100000)   
8.252447253966238                                             
>>> timeit("[['x', 'y'] for _ in range(1000)]", number=100000)
9.461477918957826
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...