2016-10-10 54 views
-2

我有一個列表的列表如何在python中壓縮列表的列表?

sample = [['A','T','N','N'],['T', 'C', 'C', 'C']],[['A','T','T','N'],['T', 'T', 'C', 'C']]. 

我試圖壓縮文件,使得只有A/T/G/C在列表和輸出必須是一個列表

[['AT','TCCC'],['ATT','TTCC']] 

當我使用此代碼:

tt = ["".join(y for y in x if y in {'A','G','T','C'}) for x in sample] 

不過,我只得到輸出:

['ATT','TTCC'] 

任何建議,我哪裏錯了?

在我實際的代碼,我第一次調換名單:

seq_list = [['TCCGGGGGTATC', 'TCCGTGGGTATC', ...]] # one nested list 

numofpops = len(seq_list) 

### Tranposing. Moving along the columns only 

#column_list = [] 
for k in range(len(seq_list)): 
    column_list = [[] for i in range(len(seq_list[k][0]))] 
    for seq in seq_list[k]: 
     for i, nuc in enumerate(seq): 
      column_list[i].append(nuc) 
      ddd = column_list 
    print ddd 

tt = ["".join(y for y in x if y in {'A','G','T','C'}) for x in ddd] 
print tt 
+0

我懷疑標籤[zip]你用的不是你的意思。你的'樣本'也不像列表清單。 –

+2

你沒有壓縮(從單獨的序列中配對元素),你在這裏加入和過濾。 –

+4

你的'sample'不是一個有效的Python表達式。你能把它做成一個嗎?當輸入數據無效時,我們很難提供幫助。您的示例代碼和實際輸出顯示只有'sample'表達式的後半部分實際上用作輸入。 –

回答

3

您的實際代碼丟棄列表。您只處理最後一項

否則,您的代碼正常工作。只要做的是,在環,然後將結果追加到一些最後的名單:

results = [] 

for k in range(len(seq_list)): 
    column_list = [[] for i in range(len(seq_list[k][0]))] 
    for seq in seq_list[k]: 
     for i, nuc in enumerate(seq): 
      column_list[i].append(nuc) 
    # process `column_list` here, in the loop (no need to assign to ddd) 
    tt = ["".join(y for y in x if y in {'A','G','T','C'}) for x in column_list] 

    results.append(tt) 

請注意,您可以使用,而不是你換位列表中zip()功能:

results = [] 
for sequence in seq_list: 
    for column_list in zip(*sequence): 
     tt = [''.join([y for y in x if y in 'AGTC']) for x in column_list] 
     results.append(tt) 
0

我想你已經給定了輸入是在一個列表中的兩個項目。然後,你將使用一個列表理解與2層嵌套。在最深層次,你過濾掉不A, T, GC然後join其他項目:

sample = [[['A','T','N','N'],['T', 'C', 'C', 'C']], [['A','T','T','N'],['T', 'T', 'C', 'C']]] 

result = [[''.join(i for i in lst if i in 'ATGC') for lst in sub] for sub in sample] 
#         ^<- filter items 
#   ^<- join the matching items 
print(result) 
# [['AT', 'TCCC'], ['ATT', 'TTCC']] 
+0

這工作得很好。非常感謝 – Biotechgeek

1

你要做到以下幾點:

sample = [[['A','T','N','N'],['T', 'C', 'C', 'C']], [['A','T','T','N'],['T', 'T', 'C', 'C']]] 

然後:

tt = [[''.join([c for c in sublist if c in 'AGTC']) for sublist in doublet] for doublet in sample] 

也許這樣更具可讀性:

tt = [ 
    [''.join([c for c in sublist if c in 'AGTC']) 
    for sublist in doublet] 
    for doublet in sample 
] 

它提供所需的結果:

[['AT', 'TCCC'], ['ATT', 'TTCC']] 
1

您可以先創建一個輔助函數:

def filterJoin(s): 
    return ''.join(x for x in s if x in 'ATGC') 

然後:

>>> sample = [['A','T','N','N'],['T', 'C', 'C', 'C']],[['A','T','T','N'],['T', 'T', 'C', 'C']] 
>>> [[filterJoin(s) for s in t] for t in sample] 
[['AT', 'TCCC'], ['ATT', 'TTCC']] 
+0

真正的問題在於,OP誤會將'print'附加到列表中。它們有一個循環,其中設置了列表,並且只有在循環完成後才使用最後一個列表。 –

+0

@MartijnPieters我在OP編輯代碼之前發佈了答案。我會保留它,因爲使用輔助函數的想法在這裏是相當自然的,雖然你剛剛接受的答案(+1)顯示了實際問題。 –

+0

這就是爲什麼我試圖讓OP釐定其樣本;他們爲一個這樣的名單做正確的事情,而這是最後一個。然後他們張貼在評論(我加入到這個問題)的實際代碼顯示,這是所有的X-Y的問題。 –