2013-05-26 127 views
0

創建簡單的嵌套列表理解時遇到問題。每個級別的解包都不會從列表結構中正確刪除列表。下面的細節。無法爲嵌套列表理解解壓縮列表結構

file_list = ['genes1.csv', 'genes2.csv'] 

set_list = [('genes2.csv', (['A2LD1', 'A1BG', 'A2ML1', 'A1CF', 'A2M', 'A2BP1'], [-0.95, 1.226, 3.473, 4.958, 6.645, 11.953])), ('genes1.csv', (['A2LD1', 'A1BG', 'A2ML1', 'A1CF', 'A2M', 'A2BP1'], [-0.529, 1.444, 3.133, 4.303, 6.387, 11.117]))] 

set_list.sort(key = lambda (x,y): file_list.index(x)) 

讓我們看一下排序set_list:

print '\nset_list sorted:', set_list 

set_list sorted: [('genes1.csv', (['A2LD1', 'A1BG', 'A2ML1', 'A1CF', 'A2M', 'A2BP1'], [-0.529, 1.444, 3.133, 4.303, 6.387, 11.117])), ('genes2.csv', (['A2LD1', 'A1BG', 'A2ML1', 'A1CF', 'A2M', 'A2BP1'], [-0.95, 1.226, 3.473, 4.958, 6.645, 11.953]))] 

現在,我們要拉只值樣品1,在這種情況下,從genes1.csv值:

sample_1_values = [] 
for i, (j, k) in set_list[:1]: 
    for v in k: 
     sample_1_values.append(v) 

print '\nsample 1 values:', sample_1_values 

輸出:

sample 1 values: [-0.529, 1.444, 3.133, 4.303, 6.387, 11.117] 

現在的目標是創造sample_1_values爲嵌套列表理解:

sample_1_values = [[v for v in k] for i, (j, k) in set_list[:1]] 

print '\nsample_1_values from list comprehension:', sample_1_values 

和輸出:

[[-0.529, 1.444, 3.133, 4.303, 6.387, 11.117]] 

讓我們打破嵌套結構,第一:

s_list_comp_1 = [k for i, (j, k) in set_list[:1]] 

print '\ninner list comprehension:', s_list_comp_1 
print type(s_list_comp_1) 

輸出:

inner list comprehension: [[-0.529, 1.444, 3.133, 4.303, 6.387, 11.117]] 
<type 'list'> 

未發生拆箱。現在的外嵌套:

s_list_comp_2 = [v for v in s_list_comp_1] 

print '\nouter list comprehension', s_list_comp_2 
print type(s_list_comp_2) 

輸出:

[[-0.529, 1.444, 3.133, 4.303, 6.387, 11.117]] 
<type 'list'> 

同樣的問題,該名單尚未解開這個時候。隨着for語句和追加,我們看到它正確:

s_list_comp_2 = [] 
for v in s_list_comp_1: 
    for l in v: 
     s_list_comp_2.append(l) 

print '\ncorrect unpacking:', s_list_comp_2 

輸出:

correct unpacking: [-0.529, 1.444, 3.133, 4.303, 6.387, 11.117] 

正確的拆包層次需要,我可以不使用嵌套列表理解複製的另一個層次。創建sample_1_values的整個表達式必須是嵌套的列表理解,以便稍後插入而不必佔用此佔位符。建議?

回答

2

如果我理解你的權利,你想這樣:

[v for i, (j, k) in set_list[:1] for v in k] 

在你的「內部列表理解」的例子,沒有出現拆包因爲列表解析簡單地得到從每個項目中set_listk值,而項目是一個列表。

在你原來的例子:

[[v for v in k] for i, (j, k) in set_list[:1]] 

的項目是由v for v in k解開,但是你以一個新的列表了出來(有一個嵌套列表理解)重新包裝它們。

你想要的不是一個嵌套的列表理解,而是簡單的單個列表理解與多個for子句。

+0

是的,完全正確,它使用for循環和追加給出與上面的sample_1_values相同的所需輸出。不知道你可以像這樣構造它。謝謝! – user2277435