Разбиение списка на неровные кортежи

Я пытаюсь разбить список строк на список кортежей неравномерной длины, содержащих эти строки, причем каждый кортеж содержит строки, первоначально разделенные пустыми строками. В принципе, мне нужен параметризованный раскол, который я мог бы применить к спискам. Если мой первоначальный список выглядит так:

init = ['a', 'b', '', 'c', 'd e', 'fgh', '', 'ij', '', '', 'k', 'l', ''] 

Последний элемент этого списка всегда закрывается '' . Могут быть последовательные '' s, которые должны рассматриваться как синглы. В результате мне нужно:

 end = [('a', 'b'), ('c', 'd e', 'fgh'), ('ij',), ('k', 'l')] 

У меня уже есть уродливый код, который выполняет задание и выходит за пределы диапазона после полного раскрытия списка:

 end = [] while init[-1] == u'': init.pop() l = [] while init[-1] != u'': l.append(init.pop()) end.append(tuple(l)) 

Я хотел бы использовать понимание, но безуспешно пробовал распаковывать списки аргументов, реверсировать списки с deque , используя очереди очереди и различные запахи кода, теперь я сомневаюсь, имеет ли смысл искать решение (вложенное) понимание?

2 Solutions collect form web for “Разбиение списка на неровные кортежи”

Вы можете использовать функцию itertools.groupby для группировки элементов на основе их размеров, например

 >>> from itertools import groupby >>> init = ['a', 'b', '', 'c', 'd e', 'fgh', '', 'ij', '', '', 'k', 'l', ''] >>> [tuple(g) for valid, g in groupby(init, key=lambda x: len(x) != 0) if valid] [('a', 'b'), ('c', 'd e', 'fgh'), ('ij',), ('k', 'l')] 

Это в основном группирует элементы по их длине. Если длина элемента не равна нулю, они будут помещены в группу, пока не будет выполнен элемент из другой группы. key функция вернет True для группы элементов, длина которых не равна нулю, в противном случае – False . Мы игнорируем группу с False (следовательно, проверка if valid ).

Ниже приведен более сжатый и общий подход с groupby если вы хотите разбить свой список на специальный разделитель:

 >>> delimiter = '' >>> [tuple(g) for k, g in groupby(init, delimiter.__eq__) if not k] [('a', 'b'), ('c', 'd e', 'fgh'), ('ij',), ('k', 'l')] 
  • как получить часовое время?
  • Я не могу установить 'pip' для python
  • ошибка urlopen с https и python 2.7 на ubuntu 12.10
  • Тайм-аут на вызов функции Python внутри timeit
  • Python Убейте предложение
  • scrapy spider отправляет сигнал spider_close перед закрытием
  • Ошибка ввода () - NameError: имя «...» не определено
  • Автоматизация ввода для терминала
  • Python - лучший язык программирования в мире.