压缩一个空的可迭代对象
Zipping an empty iterable
我想遍历一个可迭代的元组并将每个值存储在一个新变量中。我可以用 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 returns 是一个空的可迭代对象而不是包含两个空列表的可迭代对象
如何处理可迭代对象为空的情况?
尴尬的特殊外壳:
x, y = [*zip(*your_iterable)] or [(), ()]
或者只是不使用 zip(*...)
。您的 zip(*enumerate(...))
可以通过使用 range
:
构建索引来替换
y = tuple(range(0,-1,5))
x = tuple(range(len(y)))
我在这里调用 tuple
来复制 zip
的行为,但根据您的操作,这可能不是必需的。
如果你只想要一个默认值,你总是可以手动扩展解包以确保至少有两个参数:
x, y, *_ = *zip(*enumerate(range(0,-1,5))), [], []
我想遍历一个可迭代的元组并将每个值存储在一个新变量中。我可以用 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 returns 是一个空的可迭代对象而不是包含两个空列表的可迭代对象
如何处理可迭代对象为空的情况?
尴尬的特殊外壳:
x, y = [*zip(*your_iterable)] or [(), ()]
或者只是不使用 zip(*...)
。您的 zip(*enumerate(...))
可以通过使用 range
:
y = tuple(range(0,-1,5))
x = tuple(range(len(y)))
我在这里调用 tuple
来复制 zip
的行为,但根据您的操作,这可能不是必需的。
如果你只想要一个默认值,你总是可以手动扩展解包以确保至少有两个参数:
x, y, *_ = *zip(*enumerate(range(0,-1,5))), [], []