2012-10-08 43 views
7

Tôi đang làm việc trên một số trình tự giống như FASTA (không phải FASTA, nhưng một cái gì đó tôi đã xác định tương tự như một số PDB bị loại bỏ khỏi máy chủ PISCES).Từ điển lồng nhau

Tôi có một câu hỏi. Tôi có một số không nhỏ các chuỗi được gọi là nCatSeq, có nhiều MULTIPLE nBasinSeq. Tôi đi qua một tập tin PDB lớn và tôi muốn giải nén cho mỗi nCatSeq tương ứng nBasinSeq mà không cần dư thừa trong từ điển. Đoạn mã thực hiện điều này được đưa ra dưới đây.

nCatSeq=item[1][n]+item[1][n+1]+item[1][n+2]+item[1][n+3] 
nBasinSeq=item[2][n]+item[2][n+1]+item[2][n+2]+item[2][n+3] 
if nCatSeq not in potBasin: 
    potBasin[nCatSeq]=nBasinSeq 
else: 
    if nBasinSeq not in potBasin[nCatSeq]: 
     potBasin[nCatSeq]=potBasin[nCatSeq],nBasinSeq 
    else: 
     pass 

tôi nhận được sau khi câu trả lời cho một nCatSeq,

'4241': ((('VUVV', 'DDRV'), 'DDVG'), 'VUVV') 

những gì tôi muốn tuy nhiên là:

'4241': ('VUVV', 'DDRV', 'DDVG', 'VUVV')

Tôi không muốn tất cả dấu ngoặc phụ do lệnh sau

potBasin[nCatSeq]=potBasin[nCatSeq],nBasinSeq 

(xem ở trên đoạn mã)

Có cách nào để làm điều này?

Trả lời

1

Bạn có thể thêm chúng như các bộ:

if nCatSeq not in potBasin: 
    potBasin[nCatSeq] = (nBasinSeq,) 
else: 
    if nBasinSeq not in potBasin[nCatSeq]: 
     potBasin[nCatSeq] = potBasin[nCatSeq] + (nBasinSeq,) 

Bằng cách đó, chứ không phải là:

(('VUVV', 'DDRV'), 'DDVG') 
# you will get 
('VUVV', 'DDRV', 'DDVG') # == ('VUVV', 'DDRV')+ ('DDVG',) 
+0

Cảm ơn các bạn, Hayden - Tôi đã từng đề nghị của bạn và nó dường như chỉ là những gì tôi cần! Cảm ơn nhiều. – user1729355

5

Sự cố là đặt dấu phẩy để "nối thêm" phần tử chỉ tạo một bộ mới mỗi lần. Để giải quyết điều này, bạn sử dụng danh sách và append:

nCatSeq=item[1][n]+item[1][n+1]+item[1][n+2]+item[1][n+3] 
nBasinSeq=item[2][n]+item[2][n+1]+item[2][n+2]+item[2][n+3] 
if nCatSeq not in potBasin: 
    potBasin[nCatSeq]=[nBasinSeq] 
elif nBasinSeq not in potBasin[nCatSeq]: 
     potBasin[nCatSeq].append(nBasinSeq) 

Thậm chí tốt hơn là nên thay vì làm potBasin một từ điển thông thường, thay thế nó bằng một defaultdict. Mã này sau đó có thể được đơn giản hóa để:

# init stuff 
from collections import defaultdict 
potBasin = defaultdict(list) 

# inside loop 
nCatSeq=item[1][n]+item[1][n+1]+item[1][n+2]+item[1][n+3] 
nBasinSeq=item[2][n]+item[2][n+1]+item[2][n+2]+item[2][n+3] 
potBasin[nCatSeq].append(nBasinSeq) 
0

Câu hỏi của bạn nắm để làm phẳng một lồng nhau liệt kê và loại bỏ các mục nhập thừa:

def flatten(nested, answer=None): 
    if answer is None: 
     answer = [] 
    if nested == []: 
     return answer 
    else: 
     n = nested[0] 
     if is instance(n, tuple): 
      return flatten(nested[1:], nested(n[0], answer)) 
     else: 
      return flatten(nested[1:], answer+n[0]) 

Như vậy, với từ điển lồng nhau của bạn:

for k in nested_dict: 
    nested_dict[k] = tuple(flatten(nested_dict[k])) 

nếu bạn muốn loại bỏ các mục trùng lặp:

for k in nested_dict: 
    nested_dict[k] = tuple(set(flatten(nested_dict[k]))) 

Hope this helps

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