2013-06-22 21 views

回答

7

使用列表理解:

def myfunction(somestring): 
    return [line.split(',') for line in somestring.split('\n')] 

演示:

>>> def myfunction(somestring): 
...  return [line.split(',') for line in somestring.split('\n')] 
... 
>>> myfunction("1,2,3\n4,5,6") 
[['1', '2', '3'], ['4', '5', '6']] 

或者,你可以使用str.splitlines(),這像一樣工作但將分割數據任意換行符組合,即\r,\n\r\n。它處理最後一行也更聰明一些。

如果此數據來自文件,請考慮使用正確的工具;該csv module可以處理引用上更好的逗號分隔的數據的複雜性:

import csv 

with open('/your/csv/file.csv', 'rb') as inputfile: 
    reader = csv.reader(inputfile) 
    for row in reader: 
     # row is a list of column values 

的數據不來自一個文件,csv可以處理任何可迭代的,包括.splitlines()結果:

reader = csv.reader(somestring.splitlines()) 
for row in reader: 
    # row is a list of column values 
+0

你可能要考慮'splitlines'而不是'split('\ n')'。 (考慮之後,當然你可能不會切換 - 有時候你想保留'\ r',以便讓你更容易注意到當你不期待它們的時候你會被送入DOS風格的文本文件等等。 )另外,即使數據不是來自文件,我也會使用'csv',您可以將'csv.reader'提供給'StringIO',甚至是一行行列表(截至...... 2.5 ...左右)不需要像文件一樣的對象,只需要在行上迭代)。 – abarnert

+0

@abarnert:在那裏,詳細闡述。 –

1

如果你正在寫這個功能從文件中讀取的東西,那麼csv模塊是你的朋友:

import csv 

with open('somefile.txt') as f: 
    reader = csv.reader(f, delimiter=',') 
    lines = list(reader) 
+0

事實上,即使你不從文件中讀取數據,只要執行'f = StringIO.StringIO(foo)',那麼你就可以使用'csv.reader(f)'。 – abarnert

+0

是的,但我認爲對於OP來說可能有點太多:) –

+1

那麼,你也可以使用'csv.reader(foo.splitlines())',但我不想直到找出什麼時候'csv'開始接受任何可迭代的行。 (肯定是2.5;我不認爲2.3;文檔沒有說。)無論如何,關鍵在於使用'csv'具有所有相同的優點,無論數據來自文件還是標準輸入或套接字或其他。 – abarnert

2

使用列表理解與str.splitstr.splitlines

>>> strs = "1,2,3\n4,5,6" 
>>> strs.splitlines() 
['1,2,3', '4,5,6'] 
>>> [x.split(',') for x in strs.splitlines()] 
[['1', '2', '3'], ['4', '5', '6']] 

幫助上str.splitlines

>>> print str.splitlines.__doc__ 
S.splitlines(keepends=False) -> list of strings 

Return a list of the lines in S, breaking at line boundaries. 
Line breaks are not included in the resulting list unless keepends 
is given and true. 
2

如果輸入的長度爲N M行,這裏有一個發電機需要O(N)的空間而不是O(M * N):

def myfunction(text): 
    from StringIO import StringIO 
    for line in StringIO(text): 
     yield line.rstrip().split(',') 

它在ord中返回迭代器而不是具體列表呃減少內存消耗。你可以在for循環或類似的地方使用結果,如果你真的需要輸出爲列表,只需將它傳遞給構造函數list()

+0

您可以使用生成器表達式而不是寫入函數:'(line.rstrip()。split(',')for line in StringIO(text))''。我認爲,至少在簡單的情況下,基因族對於新手來說更容易理解:「這就像列表理解,但懶惰」是直觀的; 「它就像一個函數,但產生多次而不是返回一次」更多地讓你頭腦發熱。 – abarnert

+0

我想,但我喜歡功能,並希望人們寫更多。 :) –

+0

那麼,你總是可以編寫一個函數,將genexp作爲迭代器返回 - 或者,如果你有3.3,則從genexp產生。就我個人而言,我喜歡代碼,它只是一個基因組序列,每個代碼都將一個迭代器轉換爲另一個迭代器(如http://www.dabeaz.com/generators-uk/GeneratorsUK.pdf上的幻燈片1-39)。 – abarnert

相關問題