если у меня есть этот массив Python:
mac_tags = [ "global_rtgn", "global_mogn" ]
И я хочу этот массив Python:
mac_tags = [ "global_rtgn", "global_rtgn", "global_mogn","global_mogn" ]
Как я могу создать его программно?
если у меня есть этот массив Python:
mac_tags = [ "global_rtgn", "global_mogn" ]
И я хочу этот массив Python:
mac_tags = [ "global_rtgn", "global_rtgn", "global_mogn","global_mogn" ]
Как я могу создать его программно?
Обратите внимание, что это скорее функциональный способ сделать это и может не быть чистым идиоматическим кодом Python.
data = [[s, s] for s in [ "global_rtgn", "global_mogn" ]]
data = sum (data, [])
print data
sum
(b) при использовании sum вы теряете возможность использовать zip/izip вместо того, чтобы писать свои собственные.
- person Marcin; 06.03.2012
+
в списках создает новый список. Использование здесь sum()
создает новый список на каждой итерации, копируя все, что было накоплено до сих пор. Это можно было бы оптимизировать, но сделать это непросто, а CPython не делает этого. Такое использование sum()
считается неправильным, поэтому не будет предпринято никаких усилий для его оптимизации. Использование понимания списка с двумя предложениями for
или itertools.chain.from_iterable()
считается правильным способом. На самом деле, более вероятно, что будущая версия Python откажется от этого использования sum()
(поскольку они уже используются для строк), чем будет оптимизирована.
- person Sven Marnach; 06.03.2012
+
на уровне Python, но до сих пор нет причин, по которым он должен копировать каждый раз, а не оптимизировать конкатенацию.
- person Marcin; 06.03.2012
start
. И реализация в основном вызывает метод __add__()
любых объектов, которые она получает. Оптимизация этого для списков потребует некоторого особого случая в реализации sum()
.
- person Sven Marnach; 06.03.2012
sum
не требуется никакого специального регистра. Все, что для этого требуется, — это оптимизация __add__
, когда левый операнд не имеет ссылок на него вне контекста вызова, и следующее, что с ним произойдет, — это то, что он станет левым операндом другого вызова __add__
. В этом случае оптимизирующий компилятор может просто расширить массив, поддерживающий левый операнд, и скопировать содержимое правого операнда в новое пространство. Это не безумно сложная оптимизация.
- person Marcin; 06.03.2012
sum()
, и для этого потребуются списки особого случая.
- person Sven Marnach; 06.03.2012
sum
только в том случае, если вы предполагаете никаких других изменений в каком-либо коде.
- person Marcin; 06.03.2012