0

我正在从 Python 中的文件中读取数据,并且需要创建一个列表列表。每行是一个记录中的一个单独的值,每条记录由一个空行分隔\n

rsfile = 'filepath.txt'
l_s = [[line.rstrip('\n') for line in fileinput.input([rsfile]) if line != '\n']]

这给了我每行的值列表,并且不包括\n我想在更大的列表中开始一个新的子列表或列表块。

例如
'line 1a'
'line 2a'
'line 3a'
'\n'
'line 1b'
'line 2b'
'line 3b'
'\n'

[['line 1a', 'line 2a', 'line 3a'], ['line 1b', 'line 2b', 'line 3b']]

这可以通过列表理解实现吗?我最初是用两个列表创建的

for line in file:
    if line != '\n': l.append(line)

    else: l_of_l.append(l)

    l = []

感谢您的帮助!

史蒂文

4

3 回答 3

1

如果您尝试将内容收集到 4 行的组中,则食谱grouper中的函数使这变得微不足道:itertools

groups = grouper(4, file)

这会返回一个可迭代的可迭代对象——特别是s 上的izip惰性迭代器tuple。如果您特别需要列表列表,则需要执行以下操作:

groups = [list(group) for group in grouper(4, file)]

由于配方不是标准库模块的一部分,您要么必须从文档中复制并粘贴函数,要么安装名为more_itertools.

如果你想要一些稍微不同的东西……好吧,如果不确切知道你想要什么,就很难确切地知道如何编码,但你可能会在itertools.

例如,假设您要将其拆分为由只有空格的行分隔的组。我很确定有一个函数more_itertools可以为你做这件事,但你可以很容易地自己写一个。

首先,您可以groupby通过它们是否都是空格来对行进行分组:

groups = itertools.groupby(file, lambda line: not line.strip())

groupby返回key, group对。你只想要group没有key. 而且您也只想要非空行组,而不是所有组。

groups = [group for empty, group 
          in itertools.groupby(file, lambda line: not line.strip())
          if not empty]

或者,如果您明确需要一个列表列表,而不是某个任意的可迭代类型(在这种情况下,是一个_grouper惰性可迭代列表):

groups = [list(group) for empty, group 
          in itertools.groupby(file, lambda line: not line.strip())
          if not empty]

如果您查看groupby文档,这些示例实际上与此非常接近。

我可能会将其lambda line: not line.strip()分解为一个函数(或使用more_functools.negate(line.strip),或……),并将其写成两行或三行,而不是将其塞进一个大列表理解中,但如果你想要一个 1 行列表理解(和 98-字符行是可以接受的),就是这样。

于 2013-04-01T20:44:25.357 回答
1

你有空行分隔应该进入每个子列表的组,对吗?假设您的输入不是太庞大而无法立即阅读,您可以这样做:

mylines = open("filepath.txt").read()
groups = [ grp.split("\n") for grp in mylines.split("\n\n") ]

第一个split为您提供三行(或其他)的组,第二个为每个组构建一​​个子列表。

于 2013-04-01T23:31:16.120 回答
0

尝试这样的事情......它的工作原理。“f.txt”是您要读取的文件

f=open('f.txt','r')
list=[[]]
i=0
for line in f:
    if line!='\n':
        list[i].append(line.strip('\n'))
    else:
        list.append([])
        i=+1
        print i
print list
于 2013-04-01T21:02:41.503 回答