Как создать много списков и присвоить им значения

Я хочу прочитать определенное количество строк из списка и назначить все эти значения в новый список. Затем я хочу прочитать следующую связку из строки last_value+1 ранее для того же количества строк и назначить их в новый список. Пока у меня есть это:

Скажем u = [1,2,3....,9,10,11,12,13...,19,20] и я хочу назначить первые 10 значений из u в мой недавно сгенерированный list1 = [] => list1 = [1,2,..9,10]

тогда я хочу следующие 10 значений из u быть назначенным на 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 ответа

Решение

Вы можете использовать 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)]

Вы можете использовать более подходящую коллекцию, например, словарь:

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
Другие вопросы по тегам