2013-01-11 13 views
1

創建列表(兩列,固定寬度):Python的 - 從如何從這個創建列

0.35 23.8 
0.39 23.7 
0.43 23.6 
0.47 23.4 
0.49 23.1 
0.51 22.8 
0.53 22.4 
0.55 21.6 

兩個列表:

list1 = [0.35, 0.39, 0.43, ...] 
list2 = [23.8, 23.7, 23.6, ...] 

謝謝。

+1

從文件輸入? –

+3

http://whathaveyoutried.com/ –

回答

16

也許您正在尋找這樣的事情

>>> str1 = """0.35 23.8 
0.39 23.7 
0.43 23.6 
0.47 23.4 
0.49 23.1 
0.51 22.8 
0.53 22.4 
0.55 21.6""" 
>>> zip(*(e.split() for e in str1.splitlines())) 
[('0.35', '0.39', '0.43', '0.47', '0.49', '0.51', '0.53', '0.55'), ('23.8', '23.7', '23.6', '23.4', '23.1', '22.8', '22.4', '21.6')] 

您可以輕鬆地擴展上述解決方案,如果你想要的號碼,以滿足任何類型的iterables,包括文件

>>> with open("test1.txt") as fin: 
    print zip(*(e.split() for e in fin)) 


[('0.35', '0.39', '0.43', '0.47', '0.49', '0.51', '0.53', '0.55'), ('23.8', '23.7', '23.6', '23.4', '23.1', '22.8', '22.4', '21.6')] 

不是字符串的作爲浮點數,您需要通過浮點函數將其傳遞至地圖

>>> zip(*(map(float, e.split()) for e in str1.splitlines())) 
[(0.35, 0.39, 0.43, 0.47, 0.49, 0.51, 0.53, 0.55), (23.8, 23.7, 23.6, 23.4, 23.1, 22.8, 22.4, 21.6)] 

最後將它解壓縮到兩個單獨的列表

>>> from itertools import izip 
>>> column_tuples = izip(*(map(float, e.split()) for e in str1.splitlines())) 
>>> list1, list2 = map(list, column_tuples) 
>>> list1 
[0.35, 0.39, 0.43, 0.47, 0.49, 0.51, 0.53, 0.55] 
>>> list2 
[23.8, 23.7, 23.6, 23.4, 23.1, 22.8, 22.4, 21.6] 

它那麼如何工作

zip需要iterables的列表,並返回成對元組的列表,每個迭代器。 itertools.izip是相似的,但不是返回成對元組列表,而是返回成對元組的迭代器。這將是一個以上存儲器友好

map施加一個函數來迭代器的每個元件。所以map(float, e.split)會將字符串轉換爲浮點數。注意表示地圖的一個替代方法是通過LC或發電機表達

最後str.splitlines轉換換行符隔開字符串個別線路的列表。

+0

+1擊敗了我。 –

+1

恭喜10K :) – root

+0

謝謝,這就是我所需要的! – user1969754

0

試試這個:

splitted = columns.split() 
list1 = splitted[::2] #column 1 
list2 = splitted[1::2] #column 2 
+0

首先,您無法切片生成器。其次,這不會返回確切的結果,你可能意味着'splitted = column.split()'。第三,切片實際上應該被寫成'splitted [:: 2]'和'splitted [1 :: 2]',第四個可能不適用於所有形式的迭代,使用'islice'的解決方案端口 – Abhijit

+0

感謝您的更正。我的機器上沒有翻譯器來測試代碼。每一天都是學校的一天。 – rikAtee

+0

如果你沒有在本地機器上使用Python,你可以[IDEONE](http://ideone.com/ylPX64) – Abhijit