Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 1, 2013 03:00:51

MarkHammer
Зарегистрирован: 2013-02-24
Сообщения: 97
Репутация: +  0  -
Профиль   Отправить e-mail  

как разбить список ?

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)

Офлайн

#2 Апрель 1, 2013 06:45:36

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

как разбить список ?

MarkHammer
почему-то исчезает текст
Видите над текстом значек <> рядом с рожей - оборачивайте код соответствующим окружением.
MarkHammer
не используя функцию zip_longest
В 2.x ее просто нет.
Может это подойдет:
def Partition(lst,siz):
    """Разбиение списка на куски равной длины размером siz"""
    return [lst[i:i+siz] for i in range(0,len(lst),siz)]



Офлайн

#3 Апрель 1, 2013 08:31:17

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

как разбить список ?

Есть такой способ разбиения списка

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)



Офлайн

#4 Апрель 1, 2013 14:05:29

sergeek
Зарегистрирован: 2012-06-26
Сообщения: 470
Репутация: +  43  -
Профиль   Отправить e-mail  

как разбить список ?

FishHook
zip(*[iter(l)]*n)
я минут 15 не мог сообразить как оно работает

Офлайн

#5 Апрель 1, 2013 21:30:32

MarkHammer
Зарегистрирован: 2013-02-24
Сообщения: 97
Репутация: +  0  -
Профиль   Отправить e-mail  

как разбить список ?

к сожалению эти варианты не подходят… надо чтоб были использованы все элементы списка…
Может кто тогда подскажет как на python написать такую конструкцию:

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

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

Офлайн

#6 Апрель 2, 2013 00:27:12

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

как разбить список ?

while len(spisok)%count!=0:
    spisok.append('None')



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#7 Апрель 2, 2013 03:38:22

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

как разбить список ?

Во второй ветке функция называется izip_longest



Офлайн

#8 Апрель 2, 2013 05:48:47

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

как разбить список ?

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)



Офлайн

#9 Апрель 2, 2013 09:03:37

Isem
От:
Зарегистрирован: 2010-08-27
Сообщения: 447
Репутация: +  7  -
Профиль   Отправить e-mail  

как разбить список ?

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)]



Офлайн

#10 Апрель 2, 2013 12:32:36

MarkHammer
Зарегистрирован: 2013-02-24
Сообщения: 97
Репутация: +  0  -
Профиль   Отправить e-mail  

как разбить список ?

Всем спасибо за помощь !
В итоге получил такой код :

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)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version