5

Почему в Python нет понимания кортежей?

14

Я столкнулся с интересной проблемой, связанной с пониманием различных способов создания коллекций в 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 ответ(ов)

8

Вы можете использовать генераторное выражение:

tuple(i for i in (1, 2, 3))

Однако скобки уже заняты для … генераторных выражений.

0

Компрехеншн (list comprehension) работает за счет итерации по элементам и присвоения их в контейнер, тогда как кортеж (Tuple) не может принимать присвоения.

Как только кортеж создан, его нельзя расширить, модифицировать или присвоить новые значения. Единственный способ изменить кортеж — это если один из его элементов сам является изменяемым (то есть не-кортежным контейнером). Дело в том, что кортеж просто содержит ссылку на такой объект.

Кроме того, у кортежа есть свой собственный конструктор tuple(), которому можно передать любой итератор. Это означает, что для создания кортежа можно использовать, например:

tuple(i for i in (1, 2, 3))

Таким образом, вы можете создать кортеж из элементов, используя генератор.

0

Мой лучший предположение заключается в том, что у них закончились символы скобок, и они не сочли это достаточно полезным для того, чтобы оправдать добавление "некрасичного" синтаксиса...

0

Кортежи не могут быть эффективно расширены, как списки.

Следовательно, для понимания кортежа нужно использовать список внутренне, а затем преобразовать его в кортеж.

Это будет то же самое, что вы делаете сейчас: tuple([ comprehension ]).

0

Скобки не создают кортеж. Другими словами, выражение one = (two) не создаёт кортеж. Чтобы создать кортеж, вам нужно использовать запятую после элемента или вызвать функцию tuple(). Например, корректные способы создания кортежа:

one = (two,)  # с запятой
# или
one = tuple([two])  # с использованием функции tuple

Таким образом, если вам нужно преобразовать итератор в кортеж, вы можете использовать следующее решение:

tuple(i for i in myothertupleorlistordict)

Этот код создаст кортеж, содержащий элементы из вашего другого кортежа, списка или словаря.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь