kzen.dev
  • Вопросы
  • Метки
  • Пользователи
Оповещения
Вознаграждения
Регистрация
После регистрации, сможете получать уведомления об ответах и комментариях на Ваши вопросы.
Вход
Если у Вас уже есть аккаунт, войдите чтобы проверить новые уведомления.
Тут будут вознаграждения за добавленные вопросы, ответы и комментарий.
Дополнительно
Источник
Редактировать
 moooeeeep
moooeeeep
Вопрос

Как распаковать кортеж длины n в m<n переменных

В Python 3 я могу сделать следующее (см. также PEP3132 о расширенной распаковке итерабельных файлов):

a, *b = (1, 2, 3)
# a = 1; b = (2, 3)

Что я могу сделать, чтобы добиться такого же элегантного результата в Python 2.x?


Я знаю, что могу использовать одноэлементный доступ и операции нарезки, но мне интересно, есть ли более питонический способ. Мой код на данный момент:

a, b = (1, 2, 3)[0], (1, 2, 3)[1:]
# a = 1; b = (2, 3)
45 2012-04-24T14:08:41+00:00 5
 moooeeeep
moooeeeep
Редактировал вопрос 22-го сентября 2014 в 1:11
Программирование
python
iterable-unpacking
Решение / Ответ
 moooeeeep
moooeeeep
24-го апреля 2012 в 2:48
2012-04-24T14:48:16+00:00
Дополнительно
Источник
Редактировать
#16021645

Я узнал, что соответствующие PEP3132 дает некоторые примеры для Python 2.X, а также:

многие алгоритмы требуют расщепления последовательности в "первый, остальные" в паре:

В первый, остальные = сл[0], далее[1:]

[...]

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

Это = ИТЭР(сл) первый = он.далее() остальные = список ()


Другие подходы приведенный в ответах на этот вопрос:

Список Аргументов Функции Распаковки Подход

требует дополнительного определения функции/вызов:

def unpack(first, *rest): 
  return first, rest
first, rest = unpack( *seq )

Интересно, почему он реализуется в распаковке функции список аргументов, но не для нормальной распаковки кортежа.

Подход Генератор

Авторы. Также требует пользовательской реализации функции. Это немного более гибким относительно числа переменных first.

def unpack_nfirst(seq, nfirst):
  it = iter(seq)
  for x in xrange(nfirst):
    yield next(it, None)
  yield tuple(it)
first, rest = unpack_nfirst(seq, 1)

Наиболее подходящие для Python, вероятно, будут те, которые упомянуты в выше Пеп, я думаю?

 Community
Community
Редактировал ответ 23-го мая 2017 в 12:02
30
0
F&#233;lix Cantournet
Félix Cantournet
24-го апреля 2012 в 2:17
2012-04-24T14:17:38+00:00
Дополнительно
Источник
Редактировать
#16021641

Я могу ошибаться, но насколько я знаю.

a, *b = (1, 2, 3)

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

8
0
 georg
georg
24-го апреля 2012 в 2:31
2012-04-24T14:31:06+00:00
Дополнительно
Источник
Редактировать
#16021644

Я'ве получил этой маленькой, но удобной функции:

def just(n, seq):
    it = iter(seq)
    for _ in range(n - 1):
        yield next(it, None)
    yield tuple(it)

Например:

a, b, c = just(3, range(5))
print a, b, c
## 0 1 (2, 3, 4)

также работает с меньшей аргументы:

a, b, c = just(3, ['X', 'Y'])
print a, b, c
## X Y ()

В ответ на комментарий, можно также определить:

def take2(a, *rest): return a, rest
def take3(a, b, *rest): return a, b, rest
def take4(a, b, c, *rest): return a, b, rest
... etc

и использовать его как это:

p = (1,2,3)
a, b = take2(*p)
print a, b
## 1 (2, 3)
 georg
georg
Редактировал ответ 24-го апреля 2012 в 3:13
8
0
 jamylak
jamylak
24-го апреля 2012 в 2:24
2012-04-24T14:24:18+00:00
Дополнительно
Источник
Редактировать
#16021642

Я не думаю, что есть лучший способ, чем тот, который вы опубликовали, но вот альтернативный вариант с использованием iter.

>>> x = (1,2,3)
>>> i = iter(x)
>>> a,b = next(i), tuple(i)
>>> a
1
>>> b
(2, 3)
4
0
 Bittrance
Bittrance
24-го апреля 2012 в 2:24
2012-04-24T14:24:18+00:00
Дополнительно
Источник
Редактировать
#16021643

Не уверен в контексте, но как насчет .pop(0)?

Я вижу, что в вашем примере есть кортежи, но если вы хотите делать то, что вы делаете, списки были бы более подходящими, я думаю? (Если только нет какой-то веской причины для того, чтобы они были неизменяемыми, не указанной в вопросе).

b = [1,2,3]
a = b.pop(0)
2
0
Похожие сообщества 30
Python beginners
Python beginners
17 345 пользователей
Вопросы про Python для чайников. Cпам и троллинг неприемлем. Частозадаваемые вопросы: https://github.com/ru-python-beginners/faq/blob/master/README.md Правила группы: https://t.me/ru_python_beginners/1649981
Открыть telegram
Python
Python
14 260 пользователей
Уютный чат для профессионалов, занимающихся поиском питоньих мудростей. Как не получить бан: https://t.me/ru_python/1961404
Открыть telegram
🐍 Python Stepik Chat
🐍 Python Stepik Chat
11 616 пользователей
Этот уютный чат создан для помощи в решение задач на прекрасном курсе "Поколение Python: курс для начинающих" и не только. Правила: https://t.me/pythonstepikchat/619142 Чат для оффтопа - t.me/+fqNb78zlQY81NGUy Наш канал - @kimport_this
Открыть telegram
aiogram
aiogram
8 250 пользователей
Репозиторий: https://github.com/aiogram/aiogram Сайт: https://aiogram.dev Полезная информация: https://t.me/aiogram_ru/1421485?thread=1421477
Открыть telegram
Python — вакансии и аналитика
Python — вакансии и аналитика
6 468 пользователей
Публикуем вакансии и запросы на поиск работы по направлению Python, Flask и т.д. Здесь всё: full-time, part-time, remote и разовые подработки. См. также: @golang_jobs, @qa_jobs, @devops_jobs, @javascript_jobs, @nodejs_jobs, @uiux_jobs, @products_jobs
Открыть telegram
Сообщество Python Программистов
Сообщество Python Программистов
5 885 пользователей
Канал: @pip_install Наши сайты: https://python-scripts.com https://selenium-python.com https://itfy.org Мы в ВК: https://vk.com/open_sourcecode Вакансии: https://t.me/python_scripts_hr
Открыть telegram
Добавить вопрос
Категории
Все
Технологий
Культура / Отдых
Жизнь / Искусство
Наука
Профессии
Бизнес
Пользователи
Все
Новые
Популярные
1
Ilya Smirnov
Зарегистрирован 5 дней назад
2
Денис Васьков
Зарегистрирован 1 неделю назад
3
Dima Patrushev
Зарегистрирован 1 неделю назад
4
sirojidddin otaboyev
Зарегистрирован 2 недели назад
5
Елена Гайдамамакинат
Зарегистрирован 2 недели назад
ID
KO
RU
© kzen.dev 2023
Источник
stackoverflow.com
под лицензией cc by-sa 3.0 с атрибуцией