python - 在列表中动态生成列表元素

标签 python generator sequence-generators

我有一个列表,它由以下元素组成,

list1 = [a1,a2,a3]

这个列表的每个元素本身可以是一个可变大小的列表,例如,

a1 = [x1,y1,z1], a2 = [w2,x2,y2,z2], a3 = [p3,r3,t3,n3]

我可以直接设置一个循环遍历 list1 的生成器,并生成每个元素的成分;

array = []
for i in list1:
    for j in i:
        array.append[j]
        yield array

但是,有没有一种方法可以指定数组的大小?

例如 - 批量大小为两个;

1st yield : [x1,y1]
2nd yield : [z1,w1]
3rd yield : [x2,y2]
4th yield : [z2,p3]
5th yield : [r3,t3]
6th yield : [n3]
7th yield : repeat 1st

或批量大小为 4;

1st yield : [x1,y1,z1,w1]
2nd yield : [x2,y2,z2,p3]
3rd yield : [r3,t3,n3]
4th yield : repeat first

对于不同大小的列表执行此操作似乎很重要,每个列表都包含其他不同大小的列表。

最佳答案

这很简单,实际上,使用 itertools:

>>> a1 = ['x1','y1','z1']; a2 = ['w2','x2','y2','z2']; a3 = ['p3','r3','t3','n3']
>>> list1 = [a1,a2,a3]
>>> from itertools import chain, islice
>>> flatten = chain.from_iterable
>>> def slicer(seq, n):
...     it = iter(seq)
...     return lambda: list(islice(it,n))
...
>>> def my_gen(seq_seq, batchsize):
...     for batch in iter(slicer(flatten(seq_seq), batchsize), []):
...         yield batch
...
>>> list(my_gen(list1, 2))
[['x1', 'y1'], ['z1', 'w2'], ['x2', 'y2'], ['z2', 'p3'], ['r3', 't3'], ['n3']]
>>> list(my_gen(list1, 4))
[['x1', 'y1', 'z1', 'w2'], ['x2', 'y2', 'z2', 'p3'], ['r3', 't3', 'n3']]

注意,我们可以在 Python 3.3+ 中使用 yield from:

>>> def my_gen(seq_seq, batchsize):
...   yield from iter(slicer(flatten(seq_seq), batchsize), [])
...
>>> list(my_gen(list1,2))
[['x1', 'y1'], ['z1', 'w2'], ['x2', 'y2'], ['z2', 'p3'], ['r3', 't3'], ['n3']]
>>> list(my_gen(list1,3))
[['x1', 'y1', 'z1'], ['w2', 'x2', 'y2'], ['z2', 'p3', 'r3'], ['t3', 'n3']]
>>> list(my_gen(list1,4))
[['x1', 'y1', 'z1', 'w2'], ['x2', 'y2', 'z2', 'p3'], ['r3', 't3', 'n3']]
>>>

关于python - 在列表中动态生成列表元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45154543/

相关文章:

python - 关于 toctree 引用的警告

python - 如何在类似于 C 的 Python 中读取文件头?

Android OpenGL 库 + 用于准备 opengl 图形的软件,实际使用

java - JPA @SequenceGenerator 注释如何工作

oracle - hibernate 序列生成器不一致

Python -0.000000e+00 struct pack返回错误值

python - 创建大小为 2e5 的随机数组时 VisibleDeprecationWarning

node.js - Node 从 Q.async 返回生成值

python - 如何从生成器读取 tarfile?

java - Spring Data JPA - 具有复合键的实体,其中一列是与另一列相关的内部序列