Архивирование пустой итерации - PullRequest
1 голос
/ 16 октября 2019

Я хочу перебрать итерируемые кортежи и сохранить каждое значение в новой переменной. Я могу сделать это с zip: x, y = zip(*enumerate(range(0,30,5)))

Но это не сработает, если итерация пуста

x, y = zip(*enumerate(range(0,-1,5)))
Traceback (most recent call last):
  File "C:\Python36\lib\site-packages\IPython\core\interactiveshell.py", line 3267, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-35-76960294a673>", line 1, in <module>
    x, y = zip(*enumerate(range(0,-1,5)))
ValueError: not enough values to unpack (expected 2, got 0)

Поскольку zip возвращает пустую итерацию вместо итерируемой, содержащей два пустых списка

Как мне справиться со случаем, когда итерация пуста?

Ответы [ 2 ]

7 голосов
/ 16 октября 2019

Неуклюжий специальный корпус:

x, y = [*zip(*your_iterable)] or [(), ()]

или просто не используется zip(*...). Ваш zip(*enumerate(...)) может быть заменен построением индексов с помощью range:

y = tuple(range(0,-1,5))
x = tuple(range(len(y)))

Я звоню tuple здесь, чтобы повторить поведение zip, но в зависимости от того, что вы делаете, это может не быть необходимым.

1 голос
/ 16 октября 2019

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

x, y, *_ = *zip(*enumerate(range(0,-1,5))), [], []
...