文件中的列表列表:每4行

时间:2013-04-01 20:40:31

标签: python list list-comprehension lines

我正在阅读Python中的文件,需要创建一个列表列表。每一行都是记录中的一个单独值,每个记录用空行\n分隔。

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

这为我提供了每行的值列表,并排除了\n但是我想在更大的列表中开始一个新的子列表或列表块。

e.g。
'第1a行'
'第2a行'
'第3a行'
'\ N'
'第1b行'
'第2b行'
'第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 = []

感谢您的帮助!

史蒂芬

3 个答案:

答案 0 :(得分:1)

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

groups = grouper(4, file)

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

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)或...),并将其写为两行或三行而不是将其填入大列表理解中,但如果你想要一个单行列表理解(并且可以接受98个字符的行),就是这样。

答案 1 :(得分:1)

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

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

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

答案 2 :(得分: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