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

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

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')] 
  • Почему я могу передать метод экземпляра для multiprocessing.Process, но не многопроцессорный.Pool?
  • Когда использовать `<>` и `! =` Операторы?
  • Почему запуск строки происходит медленнее, чем в?
  • Выберите скрытое значение параметра из источника, используя python selenium chromedriver
  • Как создать словарь из словаря в python?
  • Импорт молча убивает нить
  • Как использовать относительный импорт без python -m?
  • Преобразование строки Python в кортеж без разделения символов
  • Относительный импорт за миллиард
  • Как выполнить итерацию через группу pandas и проверить, есть ли строка в каждой группе?
  • Почему не конструктор суперкласса, вызываемого при объявлении объекта подкласса?
  •  
    Interesting Posts for Van-Lav

    использовать моноширинный шрифт системы в gtk textview

    Как указать зависимости при создании файла setup.py для пакета python

    Функция TensorFlow random_shuffle_queue закрыта и имеет недостаточные элементы

    get_xticklabels () содержит пустые текстовые экземпляры

    Python, IMAP и GMail. Отметить сообщения как SEEN

    Python, кроме None

    Как использовать проверку подлинности Windows для подключения к серверу MS SQL с рабочей станции Windows в другом домене с помощью Python

    недействительный литерал для int () с базой 10: 'on' Python-Django

    Python Tkinter PhotoImage

    Создание полнотекстовой поисковой системы: с чего начать

    Использование python для поиска элементов в списке списков на основе ключа, который является элементом внутреннего списка?

    Чтение файла с использованием «open ()« vs »с open ()«

    Как сделать простой Pika SelectConnection для отправки сообщения в python?

    Как отобразить pdf, который был загружен в python

    Python: Как игнорировать исключение и продолжить?

    Python - лучший язык программирования в мире.