Найти (начало: конец) позиции, которые подсписки встречаются в списке.питон - PullRequest
3 голосов
/ 12 декабря 2011

Если у вас длинный список чисел:

example=['130','90','150','123','133','120','160','45','67','55','34']

и подсписки в списке как

sub_lists=[['130','90','150'],['90','150'],['120','160','45','67']]

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

results=[[0-2],[1-2],[5-8]]

Я пытался что-то вроде

example=['130','90','150','123','133','120','160','45','67','55','34']

sub_lists=[['130','90','150'],['90','150'],['120','160','45','67']]

for p in range(len(example)):
    for lists in sub_lists:
        if lists in example:
            print p

но это не сработало?

Ответы [ 2 ]

3 голосов
/ 12 декабря 2011

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

example=['130','90','150','123','133','120','160','45','67','55','34']
sub_lists=[['130','90','150'],['90','150'],['120','160','45','67']]

for i in range(len(example)):
    for li in sub_lists:
        length = len(li)
        if example[i:i+length] == li:
            print 'List %s has been matched at index [%d, %d]' % (li, i, i+length-1)

Выходы:

List ['130', '90', '150'] has been matched at index [0, 2]
List ['90', '150'] has been matched at index [1, 2]
List ['120', '160', '45', '67'] has been matched at index [5, 8]
2 голосов
/ 12 декабря 2011

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

example=['130','90','150','123','133','120','160','45','67','55','34']

sub_lists=[['130','90','150'],['90','150'],['120','160','45','67']]

def f(example, sub_lists) :
    for l in sub_lists:
        yield [example.index(l[0]),example.index(l[-1])]

print [x for x in f(example,sub_lists)]

>>> [[0, 2], [1, 2], [5, 8]]
...