Создать список одного элемента, повторяется n раз в Python

С C ++ 17 вы также можете вернуть одно или более неизменяемых / непокрытых значений (в некоторых случаях). Возможность возврата неизменяемых типов осуществляется с помощью новой гарантированной оптимизации возвращаемого значения, и она прекрасно сочетается с агрегатами и тем, что можно назвать конструкторами шаблона .

template
struct many {
  T1 a;
  T2 b;
  T3 c;
};

// guide:
template
many(T1, T2, T3) -> many;

auto f(){ return many{string(),5.7, unmovable()}; }; 

int main(){
   // in place construct x,y,z with a string, 5.7 and unmovable.
   auto [x,y,z] = f();
}

Симпатичная вещь в том, что гарантировано не вызвать любого копирования или перемещения. Вы можете сделать пример many struct variadic тоже. Дополнительная информация:

Возвращение переменных адатов (struct) и синтаксиса для C ++ 17 Variadic template «Руководство по выведению из строя»

434
задан sohnryang 1 January 2018 в 12:16
поделиться

4 ответа

Вы также можете написать:

[e] * n

Обратите внимание, что если e, например, пустой список, вы получите список с n ссылками на тот же список, а не с n независимыми пустыми списками.

Тестирование производительности

На первый взгляд кажется , что повтор - это самый быстрый способ создать список из n одинаковых элементов:

>>> timeit.timeit('itertools.repeat(0, 10)', 'import itertools', number = 1000000)
0.37095273281943264
>>> timeit.timeit('[0] * 10', 'import itertools', number = 1000000)
0.5577236771712819

Но подождите - это не честный тест ...

>>> itertools.repeat(0, 10)
repeat(0, 10)  # Not a list!!!

Функция itertools.repeat на самом деле не создает список, она просто создает объект, который можно использовать для создания списка, если хотите! Давайте попробуем это еще раз, но преобразовав его в список:

>>> timeit.timeit('list(itertools.repeat(0, 10))', 'import itertools', number = 1000000)
1.7508119747063233

Итак, если вам нужен список, используйте [e] * n . Если вы хотите генерировать элементы лениво, используйте repeat .

694
ответ дан 22 November 2019 в 22:57
поделиться
>>> [5] * 4
[5, 5, 5, 5]

Будьте осторожны, когда повторяющийся элемент является списком. Список не будет клонирован: все элементы будут относиться к одному списку!

>>> x=[5]
>>> y=[x] * 4
>>> y
[[5], [5], [5], [5]]
>>> y[0][0] = 6
>>> y
[[6], [6], [6], [6]]
129
ответ дан 22 November 2019 в 22:57
поделиться

В Itertools есть функция только для этого:

import itertools
it = itertools.repeat(e,n)

Конечно, itertools дает вам итератор вместо списка. [e] * n дает вам список, но, в зависимости от того, что вы будете делать с этими последовательностями, вариант itertools может быть гораздо более эффективным.

25
ответ дан 22 November 2019 в 22:57
поделиться
[e] * n

должно работать

9
ответ дан 22 November 2019 в 22:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: