Группировка элементов в списке списков на основе другого списка списков - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть следующий список списков:

mylist = [['NNP', 'NN', 'VBZ', 'VBN', 'NNP', 'NNP'],
           ['VB', 'VBN'],
           ['NNP'],
           ['VB', 'NN'],
           ['NN', 'NN']]

У меня есть еще один список списков:

cond = [['NNP', 'NN'], ['VBZ', 'VBN', 'VB']]

Я хочу сгруппировать список элементов списка в mylist на основе списков в списке cond и получить следующий вывод.

out = [['NNP', 'NN'], ['VBZ', 'VBN'], ['NNP', 'NNP'], ['VB', 'VBN'], ['NNP'], ['VB'], ['NN'], ['NN', 'NN']]

Элементы должны быть сгруппированы таким образом, чтобы список элементов списка в mylist был частью только одного списка в cond, т.е. ['NN', 'VBZ'] или ['VBN', 'NNP'] не ожидается в выводе.

Это не тот случай, когда мне приходится разбивать список при обнаружении какого-либо элемента.

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

Я не знаю первоначальный подход, чтобы начать кодирование.

1 Ответ

0 голосов
/ 13 ноября 2018

Вот лучшее, что я мог придумать:

import itertools

mylist = [['NNP', 'NN', 'VBZ', 'VBN', 'NNP', 'NNP'],
           ['VB', 'VBN'],
           ['NNP'],
           ['VB', 'NN'],
           ['NN', 'NN']]

cond = [['NNP', 'NN'], ['VBZ', 'VBN', 'VB']]

out = list()
for sublist in mylist:
    while sublist != []:
        match = list(filter(lambda x: x != [], [list(itertools.takewhile(lambda x: x in condition, sublist)) for condition in cond]))[0]
        out.append(match)
        sublist = sublist[len(match):]

print(out)

Сначала мы перебираем все подсписки. Затем мы используем метод itertools takewhile для построения списка элементов, соответствующих любому из условий в cond. Иногда для данного condition не будет подходящего набора элементов, поэтому мы отфильтровываем [] результаты. Затем мы удаляем это количество элементов в начале списка. Мы добавляем построенный список в наш окончательный список. Затем мы снова переходим к процессу takewhile, пока sublist не будет исчерпан. Мы повторяем весь процесс для каждого подсписка в mylist.

itertools - это очень мощная библиотека в Python, и вы должны ознакомиться с ней, если вы много работаете со списками или другими итерациями в Python.

...