Как создать много списков и присвоить им значения
Я хочу прочитать определенное количество строк из списка и назначить все эти значения в новый список. Затем я хочу прочитать следующую связку из строки 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