Почему в Python нет понимания кортежа?
как мы все знаем, есть понимание списке, как
[i for i in [1, 2, 3, 4]]
и есть понимание, словарь, как
{i:j for i, j in {1: 'a', 2: 'b'}.items()}
но
(i for i in (1, 2, 3))
в конечном итоге в генераторе, а не tuple понимания. Почему?
Я думаю, что это tuple является неизменным, но это, кажется, не ответ.
10 ответов:
вы можете использовать генератор выражение:
tuple(i for i in (1, 2, 3))но скобки уже были взяты.. генератор выражений.
Раймонд Хеттингер (один из разработчиков ядра Python) сказал Это о кортежах в последний твит:
#python tip: как правило, списки предназначены для цикла; кортежи для структур. Списки однородны; кортежи разнородны.Списки переменной длины.
Это (для меня) поддерживает идею, что если элементы в последовательности связаны достаточно, чтобы быть сгенерированы, ну, генератор, то это должен быть список. Хотя Кортеж является итерационным и похоже, просто неизменяемый список, это действительно эквивалент Python структуры C:
struct { int a; char b; float c; } foo; struct foo x = { 3, 'g', 5.9 };становится в Python
x = (3, 'g', 5.9)
Начиная С Python 3.5, вы также можете использовать синтаксис распаковки для понимания кортежа:
*(x for x in range(10)),
понимание работает путем циклического или итерационного перебора элементов и назначения их в контейнер, Кортеж не может получать назначения.
после того, как кортеж создан, он не может быть добавлен, расширен или назначен. Единственный способ изменить Кортеж - это если один из его объектов сам может быть назначен (это контейнер без кортежа). Потому что кортеж содержит только ссылку на такой объект.
также - Кортеж имеет свой собственный конструктор
tuple()что вы можете дайте любой итератор. Это означает, что для создания кортежа, вы могли бы сделать:tuple(i for i in (1,2,3))
мое лучшее предположение заключается в том, что они выбежали из скобок и не думали, что это будет достаточно полезно, чтобы warrent добавлял "уродливый" синтаксис ...
как еще один плакат
macmотмечалось , самый быстрый способ создать кортеж из генератораtuple([generator]).
Сравнение Производительности
список осмысления:
$ python3 -m timeit "a = [i for i in range(1000)]" 10000 loops, best of 3: 27.4 usec per loopкортеж из списка понимания:
$ python3 -m timeit "a = tuple([i for i in range(1000)])" 10000 loops, best of 3: 30.2 usec per loopКортеж от генератора:
$ python3 -m timeit "a = tuple(i for i in range(1000))" 10000 loops, best of 3: 50.4 usec per loopкортеж из распаковки:
$ python3 -m timeit "a = *(i for i in range(1000))," 10000 loops, best of 3: 52.7 usec per loopмой версия python:
$ python3 --version Python 3.6.3
поэтому вы всегда должны создавать кортеж из списка понимания, если производительность не является проблемой.
кортежи не могут быть эффективно добавлены как список.
таким образом, понимание кортежа должно было бы использовать список внутренне, а затем преобразовать в кортеж.
Это было бы то же самое, что вы делаете сейчас : кортеж( [ понимание ] )
Я считаю, что это просто для ясности, мы не хотим засорять язык с слишком много разных символов. Также
tupleпонимание-это не необходимые, список можно просто использовать вместо этого с незначительными различиями в скорости, в отличие от понимания диктанта в отличие от понимания списка.
скобки не создают кортеж. aka one = (two) - это не Кортеж. Единственный способ обойти это либо один = (два,) или один = кортеж (два). Таким образом, решение:
tuple(i for i in myothertupleorlistordict)
мы можем генерировать кортежи из списка понимания. Следующий добавляет два числа последовательно в кортеж и дает список из чисел 0-9.
>>> print k [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99] >>> r= [tuple(k[i:i+2]) for i in xrange(10) if not i%2] >>> print r [(0, 1), (2, 3), (4, 5), (6, 7), (8, 9)]
Comments