Найти - Пользователи
Полная версия: как разбить список ?
Начало » Python для новичков » как разбить список ?
1 2
MarkHammer
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. не обращайте пожалуйста внимание на фигурные скобки - если ставить квадратные в форуму почему-то исчезает текст
doza_and
MarkHammer
почему-то исчезает текст
Видите над текстом значек <> рядом с рожей - оборачивайте код соответствующим окружением.
MarkHammer
не используя функцию zip_longest
В 2.x ее просто нет.
Может это подойдет:
def Partition(lst,siz):
    """Разбиение списка на куски равной длины размером siz"""
    return [lst[i:i+siz] for i in range(0,len(lst),siz)]
FishHook
Есть такой способ разбиения списка

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)
sergeek
FishHook
zip(*[iter(l)]*n)
я минут 15 не мог сообразить как оно работает
MarkHammer
к сожалению эти варианты не подходят… надо чтоб были использованы все элементы списка…
Может кто тогда подскажет как на python написать такую конструкцию:

пока len(spisok)/count не будет иметь тип integer (т.е. делиться без остатка) выполнять :
spisok.append('None')

и чтобы эта конструкция была переносима между версиями python 2.5 - 3.3

JOHN_16
while len(spisok)%count!=0:
    spisok.append('None')
pyuser
Во второй ветке функция называется izip_longest
FishHook
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)
Isem
FishHook
Есть такой способ разбиения списка
Веселая конструкция.
FishHook
В этом случае вместо zip поможет map.
В 3-ем питоне не проходит, но можно дописать список:
>>> 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)]
MarkHammer
Всем спасибо за помощь !
В итоге получил такой код :
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)] 
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB