如何生成许多列表并为其分配值

时间:2017-03-08 15:34:10

标签: python loops while-loop assign

我想从列表中读取特定数量的行,并将所有这些值分配给新列表。然后我想从之前的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'

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分: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)]