2015-12-08 23 views
5

Tôi đã có như:điển Loại bỏ tất cả các phần mở rộng của một chuỗi trong danh sách

'1' : ['GAA', 'GAAA', 'GAAAA', 'GAAAAA', 'GAAAAAG', 'GAAAAAGU', 'GAAAAAGUA', 'GAAAAAGUAU', 'GAAAAAGUAUG', 'GAAAAAGUAUGC', 'GAAAAAGUAUGCA', 'GAAAAAGUAUGCAA', 'GAAAAAGUAUGCAAG', 'GAAAAAGUAUGCAAGA', 'GAAAAAGUAUGCAAGAA', 'GAAAAAGUAUGCAAGAAC'] 

'2' : ['GAG', 'GAGA', 'GAGAG', 'GAGAGA', 'GAGAGAG', 'GAGAGAGA', 'GAGAGAGAC', 'GAGAGAGACA', 'GAGAGAGACAU', 'GAGAGAGACAUA', 'GAGAGAGACAUAG', 'GAGAGAGACAUAGA', 'GAGAGAGACAUAGAG', 'GAGAGAGACAUAGAGG'] 

'3' : ['GUC', 'GUCU', 'GUCUU', 'GUCUUU', 'GUCUUUG', 'GUCUUUGU', 'GUCUUUGU"', 'GUCUUUGU"G', 'GUCUUUGU"GU', 'GUCUUUGU"GUA', 'GUCUUUGU"GUAC', 'GUCUUUGU"GUACA', 'GUCUUUGU"GUACAU', 'GUCUUUGU"GUACAUC'] 

Tôi cố gắng để làm cho nó để chương trình có thể tìm thấy những chuỗi ngắn nhất trong danh sách (như GAA trong đầu tiên) và sử dụng nó để tìm tất cả các mục khác chỉ đơn giản là phần mở rộng của GAA (chuỗi bắt đầu bằng GAA và chỉ có thêm chữ cái) và loại bỏ chúng.

Tôi biết có rất nhiều câu hỏi được hỏi ở đây về cách xóa các mục khỏi danh sách, nhưng không có câu hỏi nào giúp tôi giải quyết vấn đề này.

+0

Sử dụng Regex sẽ là một cách tiếp cận tốt hơn. – ZdaR

+0

regex sẽ giúp tôi như thế nào @ZdaR? Lấy làm tiếc. Tôi đang cố gắng tự động hóa tất cả điều này, vì vậy hãy nói với từng danh sách 1,2,3 để sử dụng các chuỗi khác nhau "GAA", "GAG", "GUC" không thực sự là một lựa chọn cho tôi – lamazibiji

+0

Không mã hóa thường xuyên Biểu thức, thay vào đó tạo một Regex khi đang bay với phần tử đầu tiên của danh sách. – ZdaR

Trả lời

4
>>> dictionary={ '1': ['GAA', 'GAAA', 'GAAAA', 'GAAAAA', 'GAAAAAG', 'GAAAAAGU', 
        'GAAAAAGUA', 'GAAAAAGUAU', 'GAAAAAGUAUG', 'GAAAAAGUAUGC', 
        'GAAAAAGUAUGCA', 'GAAAAAGUAUGCAA', 'GAAAAAGUAUGCAAG', 
        'GAAAAAGUAUGCAAGA', 'GAAAAAGUAUGCAAGAA', 'GAAAAAGUAUGCAAGAAC', 
        'RTRSRS','GAG', 'GAGA', 'GAGAG', 'GAGAGA', 'GAGAGAG', 'GAGAGAGA', 
        'GAGAGAGAC', 'GAGAGAGACA', 'GAGAGAGACAU', 'GAGAGAGACAUA', 
        'GAGAGAGACAUAG', 'GAGAGAGACAUAGA', 'GAGAGAGACAUAGAG', 
        'GAGAGAGACAUAGAGG']} 
>>> new_dict = {} 

>>> for i in dictionary: 
     l = len(min(dictionary[i], key=len)) 
     m = [x for x in dictionary[i] if len(x)==l] 
     temp = [] 
     temp.extend(m) 
     for k in dictionary[i]: 
      if not any(map(lambda j: k.startswith(j), m)): 
       temp.append(k) 
     new_dict[i] = temp 

>>> print(new_dict) 
# {'1': ['GAA', 'GAG', 'RTRSRS']} 
+1

Cảm ơn tôi đã sửa mã này vào mã của tôi để nó hoạt động đúng, nhưng dường như đã loại bỏ khoảng 1.000 đoạn, nhưng có vẫn còn hàng ngàn người còn lại không bị loại bỏ. Điều này có phải do có nhiều chuỗi 3 chữ cái được kéo dài bởi các chữ cái khác và không chỉ một "GAA" trong danh sách 1? – lamazibiji

+0

Aaah! tôi biết tôi đang yêu cầu rất nhiều, nhưng làm thế nào tôi sẽ làm cho nó sử dụng nhiều thay vì 1? – lamazibiji

+0

@lamazibiji kiểm tra điều này, nếu nó vẫn không thành công, bạn có thể đưa ra một ví dụ đầu ra? –

2

Dữ liệu mẫu của bạn không thực sự tốt. Tất cả các mục khác bắt đầu bằng chuỗi ngắn nhất. Do đó, tất cả sẽ bị xóa. Dưới đây là một phiên bản ngắn hơn với một cụm từ khác:

data = {'1' : ['GAA', 'xxxxxxx', 'GAAA', 'GAAAA', 'GAAAAA'], 
     '2' : ['GAG', 'yyyyyyyy', 'GAGA', 'GAGAG', 'GAGAGA'], 
     '3' : ['GUC', 'zzzzzz', 'GUCU', 'GUCUU', 'GUCUUU']} 

Bây giờ là:

res = {} 
for key, value in data.items(): 
    shortest = min(value, key=len) 
    res[key] = [entry for entry in value if not entry.startswith(shortest) 
       or entry == shortest] 

>>> res 
{'1': ['GAA', 'xxxxxxx'], '2': ['GAG', 'yyyyyyyy'], '3': ['GUC', 'zzzzzz']} 

Lưu ý: Điều này cũng giữ vị trí của chuỗi ngắn nhất so với những người khác mà vẫn tồn tại. Chỉ trong trường hợp vấn đề này.

Các vấn đề liên quan