我正在阅读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 = []
感谢您的帮助!
史蒂芬
答案 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