Распечатать большой список из файла в несколько подсписков с перекрывающимися последовательностями в Python - PullRequest
1 голос
/ 14 июля 2011

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

(извиняюсь за загадочную последовательность, все это на 1 строке)

file1.txt
abcdefessdfekgheithrfkopeifhghtryrhfbcvdfersdwtiyuyrterdhcbgjherytyekdnfiwytowihfiwoeirehjiwoqpft


list1 = ["abcdefessdfekgheithrfkopeifhght", "fhghtryrhfbcvdfersdwtiyuyrterdhc", "erdhcbgjherytyekdnfiwyt", "nfiwytowihfiwoeirehjiwoqpft"]

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

def chunks(seq, n):
    division = len(seq) / float (n)
        return [ seq[int(round(division * i)): int(round(division * (i + 1)))] for i in xrange(n) ]

в вышеприведенном коде n указывает, на сколько подпоследовательностей будет разбит список.

Я думал о том, чтобы просто схватить концы каждой подпоследовательности и простообъединять их до конца элементов в списке путем жесткого кодирования ... но это было бы неэффективно и сложно.Есть ли простой способ сделать это?

на самом деле это было бы более 100 символов, которые я бы потребовал, чтобы были перекрыты.

Спасибо, ребята

Ответы [ 2 ]

1 голос
/ 14 июля 2011

Если вы хотите разбить вашу последовательность seq на подпоследовательности длины length с overlap количеством символов / элементов, общих для каждой подпоследовательности и ее преемника:

def split_with_overlap(seq, length, overlap):
    return [seq[i:i+length] for i in range(0, len(seq), length - overlap)]

Затем тестируете ее наваши исходные данные:

>>> seq = 'abcdefessdfekgheithrfkopeifhghtryrhfbcvdfersdwtiyuyrterdhcbgjherytyekdnfiwytowihfiwoeirehjiwoqpft'

>>> split_with_overlap(seq, 31, 5)
['abcdefessdfekgheithrfkopeifhght', 'fhghtryrhfbcvdfersdwtiyuyrterdh', 'terdhcbgjherytyekdnfiwytowihfiw', 'ihfiwoeirehjiwoqpft']
1 голос
/ 14 июля 2011
seq="abcdefessdfekgheithrfkopeifhghtryrhfbcvdfersdwtiyuyrterdhcbgjherytyekdnfiwytowihfiwoeirehjiwoqpft"
>>> n = 4
>>> overlap = 5
>>> division = len(seq)/n
>>> [seq[i*division:(i+1)*division+overlap] for i in range(n)]
['abcdefessdfekgheithrfkopeifhg', 'eifhghtryrhfbcvdfersdwtiyuyrt', 'yuyrterdhcbgjherytyekdnfiwyto', 'iwytowihfiwoeirehjiwoqpft']

вероятно, немного эффективнее сделать это так

>>> [seq[i:i+division+overlap] for i in range(0,n*division,division)]
['abcdefessdfekgheithrfkopeifhg', 'eifhghtryrhfbcvdfersdwtiyuyrt', 'yuyrterdhcbgjherytyekdnfiwyto', 'iwytowihfiwoeirehjiwoqpft']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...