python列表混乱

时间:2011-03-04 12:08:05

标签: python list coding-style

你好我有这样的情况:

>>> 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上)

7 个答案:

答案 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())

这种强制性代码(有状态的,具有就地更新)正在寻找麻烦。这似乎是功能性flattenconcat)的规范用法:

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