Форум сайта python.su
0
Re: Разделения списка на несколько частей.
Код Python
In : from itertools import zip_longest
In : def chunks(lst, count):
…: n = len(lst) // count
…: return list(x for x in zip_longest(*{iter(lst)} * n))
…:
In : chunks({1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, 3)
Out: {(1, 2, 3), (4, 5, 6), (7, 8, 9), (10, None, None)}
как таким-же образом разбить список на N частей не используя функцию zip_longest
старый python 2.6 отказывается импортировать её… а другой поставить на solaris пока-что не могу… 
P.s. не обращайте пожалуйста внимание на фигурные скобки - если ставить квадратные в форуму почему-то исчезает текст
Отредактировано MarkHammer (Апрель 1, 2013 03:03:06)
Офлайн
253
MarkHammerВидите над текстом значек <> рядом с рожей - оборачивайте код соответствующим окружением.
почему-то исчезает текст
MarkHammerВ 2.x ее просто нет.
не используя функцию zip_longest
def Partition(lst,siz): """Разбиение списка на куски равной длины размером siz""" return [lst[i:i+siz] for i in range(0,len(lst),siz)]
Офлайн
568
Есть такой способ разбиения списка
l=[1,2,3,4,5,6,7] split_list=lambda n: zip(*[iter(l)]*n) print split_list(3) print split_list(2) print split_list(4)
Офлайн
43
FishHookя минут 15 не мог сообразить как оно работаетzip(*[iter(l)]*n)
Офлайн
0
к сожалению эти варианты не подходят… надо чтоб были использованы все элементы списка…
Может кто тогда подскажет как на python написать такую конструкцию:
пока len(spisok)/count не будет иметь тип integer (т.е. делиться без остатка) выполнять :
spisok.append('None')
и чтобы эта конструкция была переносима между версиями python 2.5 - 3.3
Офлайн
221
while len(spisok)%count!=0: spisok.append('None')
Офлайн
36
Во второй ветке функция называется izip_longest
Офлайн
568
MarkHammerВ этом случае вместо zip поможет map.
к сожалению эти варианты не подходят… надо чтоб были использованы все элементы списка…
l=[1,2,3,4,5,6,7] l2=[1,2,3] print map(None, l, l2)
l=[1,2,3,4,5,6,7] split_list=lambda n: map(None, *[iter(l)]*n) print split_list(4)
Офлайн
7
FishHookВеселая конструкция.
Есть такой способ разбиения списка
FishHookВ 3-ем питоне не проходит, но можно дописать список:
В этом случае вместо zip поможет map.
>>> split_list = lambda n: zip(*[iter(l+[None]*((n-len(l)%n)%n))]*n) >>> list(split_list(5)) [(1, 2, 3, 4, 5), (6, 7, None, None, None)]
Офлайн
0
Всем спасибо за помощь !
В итоге получил такой код :
def razbitspisok(lst,kolgroup): while len(lst)%kolgroup!=0: lst.append('None') kol_in_group=int(len(lst)/kolgroup) return [lst[i:i+kol_in_group] for i in range(0,len(lst),kol_in_group)] f = razbitspisok(spisok1,NUM)
[lst[i:i+kol_in_group] for i in range(0,len(lst),kol_in_group)]
Отредактировано MarkHammer (Апрель 2, 2013 12:36:52)
Офлайн