есть список списков, например
[ [1], [2,3], [4,5,6] ]
на выходите надо получить список
[1, 2, 4, 1, 3, 5, 1, 2, 6]
[ [1], [2,3], [4,5,6] ]
[1, 2, 4, 1, 3, 5, 1, 2, 6]
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
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]
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Да и мой немного не то даёт, я не понял сразу, что там закольцованный список нужен. Хотя ТС сам виноват, из описания этого не понять.
FishHookPooHно в этом же не разобраться без бутылки!
sergeekКому как, а мне сегодня бутылку поставят. С праздником всех причастных
FishHook
PooH
но в этом же не разобраться без бутылки!
sergeekтам вообще список обьектов, c полем-списком, но это не принципиально, мне алгоритм нужен
может структура данных таки неправильно подобрана
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это оказалось необязательно
кроме самого большого
nls = [len(x) == n and iter(x) or cycle(x) for x in ls]
nls = [cycle(x) for x in ls]