2015-04-25 12 views
7

Làm cách nào để mã hóa chuỗi định dạng dấu gạch nối nối tiếp để nhóm tất cả các Nucleotide và dấu gạch ngang liên tiếp và encode them as run length.Đếm các bảng chữ cái và dấu gạch ngang liên tiếp và mã hóa chúng dưới dạng chiều dài chạy

Xem xét chuỗi của tôi là "ATGC ---- CGCTA ----- G ---". Chuỗi có chuỗi là Nucleotide theo sau là chuỗi dấu gạch nối. Tôi đang cố gắng nhóm tất cả Nucleotide liên tiếp dưới dạng chữ cái M và dấu gạch ngang liên tiếp dưới dạng chữ cái D và đặt trước nó với kích thước của chuỗi phụ.

Kết quả cuối cùng của mã hóa này phải là 4M4D5M5D1M3D.

Các đồ họa bằng hình ảnh sau đây giải thích nó hơn nữa

ATGC----CGCTA-----G--- 
| | | | | | 
V V V V V V 
4M 4D 5M 5D 1M 3D 

Khi tôi sử dụng Counter hoặc list.count(), tôi nhận được "M":10 "D":12:

from collections import Counter 

seq="ATGC----CGCTA-----G---" 

M=0 
D=0 

cigar=[] 

for char in seq:  
    if char.isalpha(): 
     M+=1 
     cigar.append("M") 
    else: 
     D+=1 
     cigar.append("D") 

print Counter(cigar) 
+0

câu hỏi của bạn là gì? –

+0

Câu hỏi là: Tôi đang cố gắng đạt được điều gì đó như 4M4D5M5D1M3D – gthm

Trả lời

11

Vấn đề này là lý tưởng cho itertools.groupby

Thực hiện

from itertools import groupby 
''.join('{}{}'.format(len(list(g)), 'DM'[k]) 
     for k, g in groupby(seq, key = str.isalpha)) 

Output '4M4D5M5D1M3D'

Giải thích

Đáng chú ý, chức năng chính là rất quan trọng ở đây. Nhóm chuỗi dựa trên đó là một bảng chữ cái hay không. Sau khi thực hiện, nó sẽ được thẳng về phía trước để đếm kích thước của mỗi nhóm và tìm ra loại của nhóm từ yếu tố quan trọng.

Một số lời giải thích của mã

  • 'DM'[k]: Đây chỉ là một cách tiện lợi của đại diện "M" if k == True else "D"
  • len(list(g)): Xác định kích thước của mỗi nhóm. Ngoài ra, nó có thể đã được viết như sum(1 for e in g)
  • '{}{}'.format: String định dạng để tạo ra một nối của tần số liên tiếp và loại
  • ''.join(: Để tham gia các yếu tố danh sách như là một chuỗi chuỗi.
+3

giải pháp tuyệt vời .... tốt hơn so với giải pháp của tôi :-) .... cảm ơn –

+0

@JoseRicardoBustosM .: Giải pháp của bạn ở đâu hoặc tôi thiếu cái gì? – Abhijit

+0

khi tôi thấy giải pháp của bạn, không đăng nó;) ..... Tôi bắt đầu nghiên cứu bài viết của bạn –

3

phương pháp cổ điển:

seq="ATGC----CGCTA-----G---" 

def MD(c): 
    if c.isalpha():return "M" 
    else : return "D" 

count=1 
string="" 
for i in range(len(seq)-1): 
    if MD(seq[i])==MD(seq[i+1]): count+=1 
    else: 
     string=string+str(count)+MD(seq[i]) 
     count=1 
string=string+str(count)+MD(seq[-1]) 
print string 
4
import re 
seq='ATGC----CGCTA-----G---' 

output = '' 
for section in re.split('(-*)', seq): 
    if section.isalpha(): 
     output += str(len(section)) + 'M' 
    elif section !='': 
     output += str(len(section)) + 'D' 
print output 
Các vấn đề liên quan