Почему в Python нет понимания кортежей?
Я столкнулся с интересной проблемой, связанной с пониманием различных способов создания коллекций в Python. Мы все знаем, что существует list comprehension, например:
[i for i in [1, 2, 3, 4]]
И также есть dictionary comprehension, например:
{i:j for i, j in {1: 'a', 2: 'b'}.items()}
Однако, когда я пытаюсь использовать аналогичный синтаксис для создания кортежа:
(i for i in (1, 2, 3))
Я получаю генератор, а не tuple comprehension. Почему так происходит?
Мое предположение заключается в том, что кортеж является неизменяемым, но это, похоже, не является точным объяснением данной ситуации. Можете ли вы пояснить, почему синтаксис для создания генераторов и кортежей различается?
5 ответ(ов)
Вы можете использовать генераторное выражение:
tuple(i for i in (1, 2, 3))
Однако скобки уже заняты для … генераторных выражений.
Компрехеншн (list comprehension) работает за счет итерации по элементам и присвоения их в контейнер, тогда как кортеж (Tuple) не может принимать присвоения.
Как только кортеж создан, его нельзя расширить, модифицировать или присвоить новые значения. Единственный способ изменить кортеж — это если один из его элементов сам является изменяемым (то есть не-кортежным контейнером). Дело в том, что кортеж просто содержит ссылку на такой объект.
Кроме того, у кортежа есть свой собственный конструктор tuple()
, которому можно передать любой итератор. Это означает, что для создания кортежа можно использовать, например:
tuple(i for i in (1, 2, 3))
Таким образом, вы можете создать кортеж из элементов, используя генератор.
Мой лучший предположение заключается в том, что у них закончились символы скобок, и они не сочли это достаточно полезным для того, чтобы оправдать добавление "некрасичного" синтаксиса...
Кортежи не могут быть эффективно расширены, как списки.
Следовательно, для понимания кортежа нужно использовать список внутренне, а затем преобразовать его в кортеж.
Это будет то же самое, что вы делаете сейчас: tuple([ comprehension ])
.
Скобки не создают кортеж. Другими словами, выражение one = (two)
не создаёт кортеж. Чтобы создать кортеж, вам нужно использовать запятую после элемента или вызвать функцию tuple()
. Например, корректные способы создания кортежа:
one = (two,) # с запятой
# или
one = tuple([two]) # с использованием функции tuple
Таким образом, если вам нужно преобразовать итератор в кортеж, вы можете использовать следующее решение:
tuple(i for i in myothertupleorlistordict)
Этот код создаст кортеж, содержащий элементы из вашего другого кортежа, списка или словаря.
Создание словаря с помощью генератора словарей
В чем разница между списками и кортежами?
Как отсортировать список/кортеж списков/кортежей по элементу на заданном индексе
Список vs кортеж: когда использовать каждый?
Сортировка списка кортежей по второму элементу (целое значение)