Перебор последовательных подсписков в Python - PullRequest
0 голосов
/ 26 марта 2010

Предлагает ли Python способ перебора всех "последовательных подсписков" данного списка L - то есть подсписков L, где любые два последовательных элемента также являются последовательными в L - или я должен написать свой собственный?

(Пример: если L = [1, 2, 3], то набор, над которым я хочу выполнить итерацию, равен {[1], [2], [3], [1, 2], [2,3 ], [1, 2, 3]}. [1, 3] пропускается, поскольку 1 и 3 не являются последовательными в L.)

Ответы [ 3 ]

2 голосов
/ 26 марта 2010

Я не думаю, что есть встроенный для этого; но, вероятно, было бы не так уж сложно написать код вручную - вы просто просматриваете все возможные длины от 1 до L.length, а затем берете все подстроки каждой длины.

Возможно, вы могли бы использовать itertools.chain(), чтобы объединить последовательности для каждой длины подстроки в генератор для всех из них.

Пример:

>>> a = [1,2,3,4]
>>> list(
... itertools.chain(
... *[[a[i:i+q] for q in xrange(1,len(a)-i+1)] for i in xrange(len(a))]
... )
... )
[[1], [1, 2], [1, 2, 3], [1, 2, 3, 4], [2], [2, 3], [2, 3, 4], [3], [3, 4], [4]]

Если вы предпочитаете их в последовательности увеличения длины, а затем и в лексографическом порядке, которую вы описали, вы бы хотели вместо этого:

itertools.chain(*[[a[q:i+q] for q in xrange(len(a)-i+1)] for i in xrange(1,len(a)+1)])
1 голос
/ 26 марта 2010

Попробуйте что-то вроде этого:

def iter_sublists(l):
    n = len(l)+1
    for i in xrange(n):
        for j in xrange(i+1, n):
            yield l[i:j]

>>> print list(iter_sublists([1,2,3]))
[[1], [1, 2], [1, 2, 3], [2], [2, 3], [3]]
1 голос
/ 26 марта 2010

Это должно работать:

def sublists(lst):
    for sublen in xrange(1,len(lst)+1):
        for idx in xrange(0,len(lst)-sublen+1):
            yield lst[idx:idx+sublen]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...