如何生成多个列表并为其赋值

how to generate many lists and assign values to them

我想从列表中读取特定行数并将所有这些值分配给新列表。然后我想从之前的 last_value+1 行中读取下一堆,以获得完全相同的行数,并将它们分配给一个新列表。到目前为止我有这个:

假设 u = [1,2,3....,9,10,11,12,13...,19,20],我想将 u 的前 10 个值分配到我新生成的 list1 = [] => list1 = [1,2,..9,10]

然后我想将 u 中的下 10 个值分配给 list2,因此 list2 = [11,12,13..,20]。到目前为止的代码是:

nLines = 10
nrepeats = 2
j=0
i=0

while (j<nrepeats):
### Generating empty lists ###
mklist = "list" + str(j) + " = []"
### do the segmentation ###
for i, uline in enumerate(u):
    if i >= i and i < i+nLines:
       mklist.append(uline)
j=j+1

现在的问题是,我无法附加到 mklist,因为它是一个字符串:

AttributeError: 'str' object has no attribute 'append'

如何在该循环中分配这些值?

您可以使用更合适的集合,例如字典:

nLines = 10
nrepeats = 2
j=0
i=0

my_dict = {}

while (j<nrepeats):
    ### Generating empty lists ###
    my_dict[str(j)] = []
    ### do the segmentation ###
    for i, uline in enumerate(u):
        if i >= i and i < i+nLines:
            my_dict[str(j)].append(uline)
j=j+1

您可以使用 zip 函数将可迭代对象中的元素分组为相同大小的组。实际上有两种方法,不同之处在于如何处理无法干净地划分源数据的情况

u = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21]

第一种方法是使用常规 zip 并丢弃剩余的片段

>>>list(zip(*[iter(u)]*10))
[(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), (11, 12, 13, 14, 15, 16, 17, 18, 19, 20)]

第二种方法使用 itertools.zip_longest 并用一些 fillvalue 填充最后一组(默认 None

>>>import itertools
>>>list(itertools.zip_longest(*[iter(u)]*10, fillvalue=None))
[(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), (11, 12, 13, 14, 15, 16, 17, 18, 19, 20), (21, None, None, None, None, None, None, None, None, None)]