2015-09-01 72 views
2

所以我有一個列表中的列表中的「合併」的列表:使用列表理解列表

每一個嵌套列表是相同的:前2個元素是由字母串,其餘都是字符串由數字組成。

我想所有的串號轉換爲花車和各相應的嵌套列表的串號集中到自己的列表(這最終是一個雙嵌套列表),所以最後的結果是這樣的:

final = [['abc','efg', [ 4.3, 5.7, 80085]], ['aba','bab', [ 1.0, 9.0, 3.0]] , ... , ... ] 

所以我的方法是使用列表理解將字符串數字轉換爲浮點數,然後將這些數字和字母串分割成單獨的列表併合並它們。

bloop = [[float(x) for x in y[2:]] for y in woot] 

bleep = [[x for x in y[:2]] for y in woot] 

所以我結束了:

bloop = [[ 4.3, 5.7, 8005.0],[ 1.0, 9.0, 3.0], ... , ... ] 
bleep = [['abc','efg'],['aba','bab'], ... , ... ] 

這裏是我打破,似乎無法繞到我的頭「合併」這些名單。

final = [] 
for i in bleep: 
    final.append(i) 
for i in bloop: 
    final.append(i) 

不幸的是,這只是把名單在一起,例如:

[['abc','efg'],['aba','bab'],[ 4.3, 5.7, 8005.0],[ 1.0, 9.0, 3.0]] 
+0

什麼你問它這正是做... – jonrsharpe

+0

邊注:'[[X中X Y [2]在活泉Y]'等同於'[ y [:2] for y in woot]' –

+1

另一面說明:儘量不要濫用list理解。它可以在大多數情況下爲你節省幾個字符,但它也可能使你的代碼難以閱讀和緩慢。 –

回答

3

什麼:

final = [x[:2] + [[float(f) for f in x[2:]]] for x in woot] 
+0

語法錯誤?關閉']'丟失。 – mhawke

+0

@mhawke修正,謝謝。我的回答完全錯誤,對此感到遺憾。 – Delgan

+0

是的,修復...並在這樣做你的答案現在是我的一樣(在我修好了我的後):) – mhawke

3

簡化你的邏輯:

final = [] 
for l in woot: 
    adjusted = l[:2] 
    adjusted.append([float(x) for x in l[2:]]) 
    final.append(adjusted) 

調試比編寫代碼要困難一倍。 因此,如果您儘可能巧妙地編寫代碼,您可以通過定義 來調試它。

— Brian W. Kernighan and P. J. Plauger in The Elements of Programming Style. 

參考:http://quotes.cat-v.org/programming/

+1

我接受你的觀點,但列表的理解不是太「聰明」。他們是肉和3素食的Python。在這種情況下,產生所需輸出的列表理解是微不足道的。 – mhawke

+0

你能否詳細說明你的意思是不是太「聰明」? – user155876

+0

@ user155876:這是對此答案中引用的引用「儘可能巧妙地編寫代碼」。我的觀點是,列表解析是一種基本的Python語言特性,它們不一定是聰明的。當然,寫一個很難解讀的列表理解是很容易的,然而,在這個特定的情況下,所需的列表理解完全不是太複雜。 – mhawke

1

這裏是一個列表理解產生您所需的輸出:

>>> [t[:2] + [[float(f) for f in t[2:]]] for t in woot] 
[['abc', 'efg', [4.3, 5.7, 80085.0]], ['aba', 'bab', [1.0, 9.0, 3.0]]] 
0

下面的想法使用列表中理解和切片的語法來分割每個子清單到包含子0,子-1和列表中索引2..n的項目列表中。這是通過使用list類型的+運算符來完成的。

爲了簡潔起見,我使用了map而不是內部理解,但如果您使用[float(ysub) for ysub in y[2:]],則沒有功能差異。

woot = [['abc','efg', '4.3', '5.7', '80085'],['aba','bab', '1.0', '9.0', '3.0']] 
print [y[:2] + [map(float, y[2:])] for y in woot] 
[['abc', 'efg', [4.3, 5.7, 80085.0]], ['aba', 'bab', [1.0, 9.0, 3.0]]] 
+1

儘管此代碼可能會回答這個問題,但提供關於此代碼爲何和/或如何回答問題的其他上下文會提高其長期價值。 – NathanOliver

+0

好主意,做完了! –

0

這似乎工作:

final = [l[0:2]+[list(map(float,l[2:]))] for l in woot] 

但也許我欺騙,因爲我使用map ...使用

+0

使用'list(map())'與使用列表理解沒有任何區別。它會產生相同的結果,實際上不是「作弊」。 – dsh

+0

當然,但他問如何做列表理解,我沒有完全使用列表理解。我知道這不是「作弊」,它只是一種不同的繼續。 – ibi0tux

0

您的嗶嗶這裏BLOOP精細答案

bloop = [[ 4.3, 5.7, 8005.0],[ 1.0, 9.0, 3.0]] 
bleep = [['abc','efg'],['aba','bab']] 
final =[] 
for i in range(len(bleep)): 
    final.append(bleep[i]+[bloop[i]]) 
print final 
0

充足,我只是想指出的是,擴展語法一般是更好的。另外,儘量避免嵌套列表理解。它幾乎總是比較清楚的,就是爲每個嵌套級別編寫一個函數,並在每個級別中放置一個列表理解。所以,我會做:

def process_list(l) : 
    #processes the sub list 
    new_list = l[:2] 
    new_list.extend([float(x) for x in l[2:]) 
    return new_list 

result = [process_list(l) for l in original_list]