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

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

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')] 
  • Автоматическая установка геттера, setter и deleter в python
  • Вложение Python с C
  • Python RE не возвращает ничего после / ref =
  • Избегание циклического (циклического) импорта в Python?
  • Возможно ли изменить переменную в python, которая находится во внешней, но не глобальной области?
  • Python 2.7: LookupError: неизвестная кодировка: cp65001
  • Как сделать тайм-аут subprocess.call с помощью python 2.7.6?
  • Сочетание 2 словарей с общим ключом
  • Python - лучший язык программирования в мире.