你好我有这样的情况:
>>> def get():
... for i in range(3):
... yield [0]
...
我希望得到这个:[0,0,0]
我的代码现在以这种方式工作:
>>> r = []
>>> r.extend(i[0] for i in get())
>>> r
[0, 0, 0]
但我不喜欢我[0] .. 一些建议?
(我在python3上)
答案 0 :(得分:2)
你的代码看起来很奇怪,但我认为它非常简单。如果只是摆脱i[0]
,请执行此操作:
>>> def get():
... for i in range(3):
... yield 0
...
>>> r = []
>>> r.extend(get())
>>> r
[0, 0, 0]
答案 1 :(得分:1)
对我来说,看起来get
只能返回长度为1的列表。如果是这样的话,请删掉大括号:
>>> def get():
... for i in range(3):
... yield 0
>>> # Or, shorter ...
>>> get = lambda: (0 for i in range(3))
>>> r = []
>>> r.extend(get())
>>> r
[0, 0, 0]
答案 2 :(得分:1)
您必须使用i[0]
的原因是因为get()
是一个生成器,每次调用它时返回大小为1的list
。因此,您的代码i[0] for i in get()
与i[0] for i in ([0],[0],[0])
相同。您的代码工作的原因是i[0]
获取返回元素的第一个元素,该元素本身就是list [0]
。
我从你的问题中收集的是你想拥有i for i in [0,0,0]
。如其他答案中所述,可以通过将生成器更改为int
0
而不是list
[0]
来实现。您可以在以下示例代码中看到生成器的结果:
>>> for i in get():
... print("i={} and i[0]={}".format(i, i[0]))
...
i=[0] and i[0]=0
i=[0] and i[0]=0
i=[0] and i[0]=0
如您所见,您的生成器每次迭代都返回[0]
,这就是您必须使用i[0]
来获取每个列表的第一个元素的原因。
此外,由于r
只是生成器的结果,因此只需执行以下操作即可简化:
>>> def gen():
... for i in range(3):
... yield 0
...
>>> r = list(gen())
>>> r
[0, 0, 0]
答案 3 :(得分:1)
r.extend(i [0] for i in get())
这种强制性代码(有状态的,具有就地更新)正在寻找麻烦。这似乎是功能性flatten(concat)的规范用法:
from itertools import chain
def flatten(listOfLists):
return chain.from_iterable(listOfLists)
def get():
for i in range(3):
yield [0]
print(list(flatten(get())))
# [0, 0, 0]
答案 4 :(得分:0)
如果您不想要数组,请不要生成数组:
>>> def get():
... for i in range(3):
... yield 0
...
>>> r = []
>>> r.extend(i for i in get())
>>> r
[0, 0, 0]
答案 5 :(得分:0)
您可以尝试这样做:
def get():
return [0] * 3
r = []
r.extend(get())
r
[0, 0, 0]
答案 6 :(得分:0)
???
def get():
for i in xrange(3):
yield 0
r = list(get())
print r
或
gen = (0 for i in xrange(3))
r = list(gen)
print r