Генерация подсписка последовательностей Python в определенном порядке - itertools? - PullRequest
0 голосов
/ 13 мая 2019

Я хотел бы генерировать подсписки определенным образом и в определенном порядке.

Идея алгоритма заключается в следующем:

  • Внешний цикл: удалить элемент перед последним
  • Внутренний цикл: удалить первый элемент

Вот пример, начинающийся со списка [A, B, C ,D]:

[A, B, C, D]
[B, C, D] (remove first item)
[C, D]  (remove first item)
[A, B, D]  (remove before last item)
[B, D]  (remove first item)
[A, D]  (remove before last item)
[D] (remove before last item)

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

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

Любой совет, пожалуйста?

1 Ответ

2 голосов
/ 13 мая 2019

Может быть выполнено с двойным вложенным пониманием + некоторая математика:

>>> data = ['A', 'B', 'C', 'D']
>>>
>>> [data[i:j-1]+[data[-1]] for j in range(len(data),0,-1) for i in range(0, j-1)] + [data[-1]]
[['A', 'B', 'C', 'D'], ['B', 'C', 'D'], ['C', 'D'], ['A', 'B', 'D'], ['B', 'D'], ['A', 'D'], ['D']]

Последний элемент является особым случаем, потому что подсписок, к которому добавлены комбинации перед ним, пуст, то есть длина фрагмента списка уменьшается следующим образом:

3 2 1
2 1
1
0
...