Найти - Пользователи
Полная версия: не могу решить: хитрый обход по списку списков
Начало » Python для экспертов » не могу решить: хитрый обход по списку списков
1 2
bismigalis
чето не могу решить, помогите

есть список списков, например
[
[1],
[2,3],
[4,5,6]
]

на выходите надо получить список
[1, 2, 4, 1, 3, 5, 1, 2, 6]
те сначала берем первые значения, потом вторые, меньшие списки берутся сначала, количество итераций равно len самого большого списка
FishHook
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
sergeek
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]
может структура данных таки неправильно подобрана? зачем такая жесть?
PooH
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]
    ]
))
sergeek
FishHook
PooH
но в этом же не разобраться без бутылки!
FishHook
sergeek
FishHookPooHно в этом же не разобраться без бутылки!
Да и мой немного не то даёт, я не понял сразу, что там закольцованный список нужен. Хотя ТС сам виноват, из описания этого не понять.
PooH
sergeek
FishHook
PooH
но в этом же не разобраться без бутылки!
Кому как, а мне сегодня бутылку поставят. С праздником всех причастных

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

PooH
молодец
FishHook
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
bismigalis
bismigalis
кроме самого большого
это оказалось необязательно

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

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

геныч все равно остановится
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