Создание списка в Python с несколькими копиями данного объекта в одной строке
Предположим, что у меня есть данный объект (строка "a", число - допустимо 0 или список ['x','y']
)
Я хотел бы создать список, содержащий много копий этого объекта, но без использования цикла for:
L = ["a", "a", ... , "a", "a"]
или
L = [0, 0, ... , 0, 0]
или
L = [['x','y'],['x','y'], ... ,['x','y'],['x','y']]
Меня особенно интересует третий случай.
Спасибо!
Ответы
Ответ 1
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
Вы можете использовать оператор *
:
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)]
Ответ 3
Вы можете сделать что-то вроде
x = <your object>
n = <times to be repeated>
L = [x for i in xrange(n)]
Заменить диапазон (n) для Python 3.
Ответ 4
Если вам нужны уникальные экземпляры и нравится golf, это (немного) короче:
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
Ответ 5
Надеюсь, это кому-нибудь поможет. Я хотел добавить несколько копий диктанта в список и придумал:
>>> myDict = { "k1" : "v1" }
>>> myNuList = [ myDict.copy() for i in range(6) ]
>>> myNuList
[{'k1': 'v3'}, {'k1': 'v3'}, {'k1': 'v3'}, {'k1': 'v3'}, {'k1': 'v3'}, {'k1': 'v3'}]
>>> myNuList[1]['k1'] = 'v4'
>>> myNuList
[{'k1': 'v3'}, {'k1': 'v4'}, {'k1': 'v3'}, {'k1': 'v3'}, {'k1': 'v3'}, {'k1': 'v3'}]
Я обнаружил, что:
>>> myNuList = [ myDict for i in range(6) ]
Не делал свежих копий диктата.