假设我有一个生成函数,它产生两个值:
def gen_func():
for i in range(5):
yield i, i**2
我想检索函数的所有迭代器值。目前,我将此代码段用于此目的:
x1, x2 = [], []
for a, b in gen_func():
x1.append(a)
x2.append(b)
这适合我,但看起来有点笨重。是否有更紧凑的编码方式?我想的是:
x1, x2 = map(list, zip(*(a, b for a, b in gen_func())))
然而,这只是给我一个语法错误。
PS:我知道我可能不应该为此目的使用发电机,但我需要在其他地方使用。 修改:x1
和x2
的任何类型都可以使用,不过,我更喜欢列表。
答案 0 :(得分:5)
如果x1
和x2
可以是元组,那就足够了
>>> x1, x2 = zip(*gen_func())
>>> x1
(0, 1, 2, 3, 4)
>>> x2
(0, 1, 4, 9, 16)
否则,您可以使用map
将list
应用于迭代器:
x1, x2 = map(list, zip(*gen_func()))
只是为了好玩,使用扩展的可迭代解包可以做同样的事情:
>>> (*x1,), (*x2,) = zip(*gen_func())
>>> x1
[0, 1, 2, 3, 4]
>>> x2
[0, 1, 4, 9, 16]
答案 1 :(得分:3)
你几乎拥有它:
x1, x2 = map(list, zip(*gen_func()))