Уведомления

Группа в Telegram: @pythonsu

#1 Июль 26, 2013 12:57:45

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

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

чето не могу решить, помогите

есть список списков, например

[
[1],
[2,3],
[4,5,6]
]

на выходите надо получить список
[1, 2, 4, 1, 3, 5, 1, 2, 6]
те сначала берем первые значения, потом вторые, меньшие списки берутся сначала, количество итераций равно len самого большого списка

Отредактировано bismigalis (Июль 28, 2013 15:40:52)

Офлайн

#2 Июль 26, 2013 13:08:52

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

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

a=[
    [2,3],
    [1],
    [4,5,6]
    ]
def flatten(lst):
    l = sorted(lst, key=lambda x: len(x))
    m = len(l[-1])
    l = map(iter, l)
    for s in xrange(m):
        for x in l:
            try:
                yield next(x)
            except StopIteration:pass
for i in flatten(a):
    print i



Офлайн

#3 Июль 26, 2013 13:10:28

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

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

l =[
[1],
[2,3],
[4,5,6]
]
res = []
for i in range(len(l)):
    for j in range(len(l[-1])):
        try:
            res.append(l[j][i])
        except IndexError:
            res.append(l[j][0])
            
res
Out[4]: [1, 2, 4, 1, 3, 5, 1, 2, 6]
может структура данных таки неправильно подобрана? зачем такая жесть?

Офлайн

#4 Июль 26, 2013 13:14:07

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

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

from itertools import cycle
def foxy_iter(ls):
    n = max(len(x) for x in ls)
    nls = [len(x) == n and iter(x) or cycle(x) for x in ls]
    for _ in range(n):
        for x in nls:
            yield next(x)
print list(foxy_iter([
    [1],
    [2,3],
    [4,5,6]
    ]
))



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Отредактировано PooH (Июль 26, 2013 13:15:26)

Офлайн

#5 Июль 26, 2013 13:21:45

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

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

FishHook
PooH
но в этом же не разобраться без бутылки!

Офлайн

#6 Июль 26, 2013 13:28:55

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

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

sergeek
FishHookPooHно в этом же не разобраться без бутылки!
Да и мой немного не то даёт, я не понял сразу, что там закольцованный список нужен. Хотя ТС сам виноват, из описания этого не понять.



Офлайн

#7 Июль 26, 2013 13:36:40

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

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

sergeek
FishHook
PooH
но в этом же не разобраться без бутылки!
Кому как, а мне сегодня бутылку поставят. С праздником всех причастных

ЗЫ: судя по трейсам ростелеком уже гуляет;)



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#8 Июль 26, 2013 13:45:50

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

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

sergeek
может структура данных таки неправильно подобрана
там вообще список обьектов, c полем-списком, но это не принципиально, мне алгоритм нужен
FishHook
я не понял сразу, что там закольцованный список нужен
по сути да, каждый список нужно заменить на закольцованный, кроме самого большого

PooH
молодец

Офлайн

#9 Июль 26, 2013 13:59:01

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

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

bismigalis
по сути да, каждый список нужно заменить на закольцованный, кроме самого большого
тогда я бы сделал так, да кода больше, но зато он хорошо читаем (как мне кажется) да и впоследствии может где-нибудь пригодиться

class RingList(object):
    def __init__(self, lst):
        self.__lst = lst
        self.index = -1
    def __iter__(self):
        return self
    def next(self):
        self.index += 1
        try:
            return self.__lst[self.index]
        except IndexError:
            self.index = 0
            return self.__lst[self.index]
a = [
    [2, 3],
    [1],
    [4, 5, 6]
    ]
def flatten(lst):
    l = sorted(lst, key=lambda x: len(x))
    m = len(l[-1])
    l = map(RingList, l)
    for _ in xrange(m):
        for x in l:
            yield next(x)
flatten(a)
for i in flatten(a):
    print i



Офлайн

#10 Июль 26, 2013 14:00:21

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

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

bismigalis
кроме самого большого
это оказалось необязательно

nls = [len(x) == n and iter(x) or cycle(x) for x in ls]

можно заменить на
nls = [cycle(x) for x in ls]

геныч все равно остановится

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version