Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 2, 2015 13:28:08

myarik
Зарегистрирован: 2012-11-20
Сообщения: 31
Репутация: +  0  -
Профиль   Отправить e-mail  

Вывести список частями

Добрый день.

Есть список неизвестной длины, нужно выводить его порциями заданой величины и остаток от списка Подскажите как правильно реализовать данную задачу.

Вот вариантов которые пришел в голову, не уверен что это оптимальное решение

def test(a, k):
    for i in xrange(len(a)/k):
        print a[i*k:(i+1)*k]
    if len(a) % k != 0 :
        print a[-(len(a) % k):]
l = [1, 2, 3, 4, 5, 6]
test(l,5)
[1, 2, 3, 4, 5]
[6]

Офлайн

#2 Фев. 2, 2015 13:49:55

Massa1994
Зарегистрирован: 2013-08-10
Сообщения: 18
Репутация: +  1  -
Профиль   Отправить e-mail  

Вывести список частями

Вот держи

def group(iterable, count):
a = []
for i in xrange(0, len(iterable), count):
a.append(iterable[i: i+count])
return a

print group(range(10), 4)
или вот ещё короче
def group(iterable, count):
return [iterable[i: i+count] for i in xrange(0, len(iterable), count)]

print group(range(10), 4)

Отредактировано Massa1994 (Фев. 2, 2015 13:53:37)

Офлайн

#3 Фев. 2, 2015 15:02:31

myarik
Зарегистрирован: 2012-11-20
Сообщения: 31
Репутация: +  0  -
Профиль   Отправить e-mail  

Вывести список частями

Спасибо

Офлайн

#4 Фев. 3, 2015 08:28:28

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10015
Репутация: +  857  -
Профиль   Отправить e-mail  

Вывести список частями

myarik
Есть список неизвестной длины
>>> def f(seq, n):
...     assert n > 0
...     lst, x = [], 0
...     for i in seq:
...         lst.append(i)
...         x += 1
...         if x == n:
...             yield lst
...             lst, x = [], 0
...     if lst:
...         yield lst
... 
>>> list(f([1, 2, 3, 4, 5], 2))
[[1, 2], [3, 4], [5]]
>>>



Офлайн

#5 Фев. 3, 2015 10:42:49

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

Вывести список частями

В официальной документации предлагается следующий вариант:

def group(iterable, count):
    return zip(*[iter(iterable)] * count)
Если количество элементов iterable не кратно count, то можно вместо zip использовать zip_longest



Офлайн

#6 Фев. 3, 2015 10:59:10

myarik
Зарегистрирован: 2012-11-20
Сообщения: 31
Репутация: +  0  -
Профиль   Отправить e-mail  

Вывести список частями

pyuser
В официальной документации предлагается следующий вариант:
Рассматривал такой вариант но он не подходил так как изначально не известно количество элементов в массиве.

>>> a = [1,2,3,4,5,6]
>>> zip(*[iter(a)] * 5)
[(1, 2, 3, 4, 5)]

Относительно zip_longest не знал, в версии 2.7.6 есть только библиотека izip_longest
Но она заменяет недостающие элементы на None

>>> for i in izip_longest(*[iter(a)] * 5): print i
...
(1, 2, 3, 4, 5)
(6, None, None, None, None)
>>>

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version