Как присоединиться к определенным элементам в списке

Мой список выглядит так:

['', 'CCCTTTCGCGACTAGCTAATCTGGCATTGTCAATACAGCGACGTTTCCGTTACCCGGGTGCTGACTTCATACTT
CGAAGA', 'ACCGGGCCGCGGCTACTGGACCCATATCATGAACCGCAGGTG', '', '', 'AGATAAGCGTATCACG
ACCTCGTGATTAGCTTCGTGGCTACGGAAGACCGCAACAGGCCGCTCTTCTGATAAGTGTGCGG', '', '', 'ATTG
TCTTACCTCTGGTGGCATTGCAACAATGCAAATGAGAGTCACAAGATTTTTCTCCGCCCGAGAATTTCAAAGCTGT', '
TGAAGAGAGGGTCGCTAATTCGCAATTTTTAACCAAAAGGCGTGAAGGAATGTTTGCAGCTACGTCCGAAGGGCCACATA
', 'TTTTTTTAGCACTATCCGTAAATGGAAGGTACGATCCAGTCGACTAT', '', '', 'CCATGGACGGTTGGGGG
CCACTAGCTCAATAACCAACCCACCCCGGCAATTTTAACGTATCGCGCGGATATGTTGGCCTC', 'GACAGAGACGAGT
TCCGGAACTTTCTGCCTTCACACGAGCGGTTGTCTGACGTCAACCACACAGTGTGTGTGCGTAAATT', 'GGCGGGTGT
CCAGGAGAACTTCCCTGAAAACGATCGATGACCTAATAGGTAA', '']

Это образцы последовательностей ДНК, считанные из файла. Список может иметь разную длину, а в одной последовательности может быть как 10, так и 10 000 букв. В исходном файле они разделены пустыми строками, следовательно, пустые элементы в списке. Как я могу объединить все элементы между пустыми?


person Tomek Sztuk    schedule 31.08.2014    source источник
comment
Конечно, это было бы проще с библиотекой, поддерживающей чтение формата FASTA. Например, Biopython.   -  person Martijn Pieters    schedule 31.08.2014
comment
Я думаю, но я не могу его использовать, я должен написать свою собственную функцию.   -  person Tomek Sztuk    schedule 31.08.2014
comment
Я написал один раньше.   -  person Martijn Pieters    schedule 31.08.2014
comment
@MartijnPieters, ты мой спаситель! Большое спасибо :)   -  person Tomek Sztuk    schedule 31.08.2014


Ответы (1)


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

lst = ['GATTACA', 'etc']
[x for x in ''.join(',' if not e else e for e in lst).split(',') if x]

Вот как это работает, используя выражения генератора и понимание списка изнутри:

  • ',' if not e else e for e in lst : заменить все '' строки в списке на ','
  • ''.join(',' if not e else e for e in lst) : объединить все строки. Теперь пробелы между последовательностями будут разделены одним или несколькими ,
  • ''.join(',' if not e else e for e in lst).split(',') : разделите строку в точках, где есть , символов, это создаст список
  • [x for x in ''.join(',' if not e else e for e in lst).split(',') if x] : наконец, удалить пустые строки, оставив список последовательностей

В качестве альтернативы ту же функциональность можно было бы написать более длинным образом, используя явные циклы, например:

answer  = [] # final answer
partial = [] # partial answer
for e in lst:
    if e == '':           # if current element is an empty string … 
        if partial:       # … and there's a partial answer
            answer.append(''.join(partial)) # join and append partial answer
            partial = []  # reset partial answer
    else:                 # otherwise it's a new element of partial answer
        partial.append(e) # add it to partial answer
else:                     # this part executes after the loop exits
    if partial:           # if one partial answer is left
        answer.append(''.join(partial)) # add it to final answer

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

person Óscar López    schedule 31.08.2014
comment
Это работает как шарм, но не могли бы вы объяснить мне, как это работает пошагово? Или написать цикл, эквивалентный приведенному выше коду? Я новичок как в Python, так и в программировании (и под новым я подразумеваю, что начал учиться две недели назад;)) и я плохо понимаю ваш код:/ Поэтому я хотел бы узнать что-то новое, а не просто использовать ваше решение: ) - person Tomek Sztuk; 31.08.2014