Уведомления

Группа в Telegram: @pythonsu

#1 Июль 26, 2013 20:17:07

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

не могу решить: хитрый обход по списку списков

>>> import itertools
>>> 
>>> lsts = [
...     [1],
...     [2, 3],
...     [4, 5, 6]
... ]
>>> 
>>> out = list(
...     itertools.chain.from_iterable(
...         map(itertools.chain,
...             itertools.islice(
...                 zip(*map(itertools.cycle, lsts)),
...                 len(lsts[-1]))))
... )
>>> out
[1, 2, 4, 1, 3, 5, 1, 2, 6]
>>>

add
удалил лишний map(itertools.chain(
>>> import itertools
>>> 
>>> lsts = [
...     [1],
...     [2, 3],
...     [4, 5, 6]
... ]
>>> 
>>> out = list(
...     itertools.chain.from_iterable(
...         itertools.islice(
...             zip(*map(itertools.cycle, lsts)),
...             len(lsts[-1])))
... )
>>> out
[1, 2, 4, 1, 3, 5, 1, 2, 6]
>>> 



Отредактировано py.user.next (Июль 31, 2013 03:43:44)

Офлайн

#2 Июль 28, 2013 13:54:20

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

не могу решить: хитрый обход по списку списков

sp = [
[1,2,3],
[4,5,6],
[7,[8,9]],
[10,11],
12,13
]
def stronglist(lst):
    res = []
    for i in lst:
        if type(i) == list:
            res.extend(stronglist(i))
        else:
            res.append(i)
    return res
    
print(stronglist(sp))
out: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]

Офлайн

#3 Июль 28, 2013 21:14:06

bismigalis
Зарегистрирован: 2010-10-02
Сообщения: 449
Репутация: +  47  -
Профиль   Отправить e-mail  

не могу решить: хитрый обход по списку списков

Всем спасибо. Вопрос решен. В финал вышли:

Вариант от PooH, которой я в итоге использовал(убрал лишнюю проверку):

#python2
from itertools import cycle
lsts = [
    [1],
    [2, 3],
    [4, 5, 6]
]
def foxy_iter(ls):
    maxlen = max(len(x) for x in ls)
    ls = [cycle(x) for x in ls]
    for i in range(maxlen):
        for x in ls:
            yield next(x)
#
print list(foxy_iter(lsts))

Подрихтованный вариант от py.user.next, полностью в функциональном стиле:
#python2
from itertools import izip, chain, cycle, islice
lsts = [
    [1],
    [2, 3],
    [4, 5, 6]
]
out = chain(*islice(izip(*map(cycle, lsts)),
                         max(map(len, lsts))))
#
print list(out)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version