0

例如:

Myfunction("1,2,3\n4,5,6")

输出将是[["1","2","3"],["4","5","6"]]

4

4 回答 4

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(), 它的工作原理与此类似.split(),但会将数据拆分为任何换行符组合,即\r,\n\r\n. 它也更聪明地处理最后一行。

如果此数据来自文件,请考虑使用正确的工具;该csv模块可以更好地处理引用逗号分隔数据的复杂性:

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
于 2013-06-22T10:20:27.747 回答
2

将列表推导与str.splitand一起使用str.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.
于 2013-06-22T10:22:54.103 回答
2

如果输入是长度为 N 的 M 行,这是一个占用 O(N) 空间而不是 O(M*N) 空间的生成器:

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

它返回一个迭代器而不是一个具体的列表,以减少内存消耗。您可以在 for 循环或类似的循环中使用结果,如果您真的希望将输出作为列表,只需将其传递给list()构造函数。

于 2013-06-22T10:30:34.467 回答
1

如果您正在编写此函数以从文件中读取内容,那么该csv模块就是您的朋友:

import csv

with open('somefile.txt') as f:
   reader = csv.reader(f, delimiter=',')
   lines = list(reader)
于 2013-06-22T10:22:05.883 回答