我有一个文件,其长度未知的行数未知。你会如何编写一个程序来判断哪一行的字符数最多,换句话说,哪一行是最长的?
我正在考虑使用for line in myFile
函数使用len(line)
并将长度附加到新列表中,因此第一行的长度将为索引0,第二行的长度将转到索引1等...然后当没有更多行要检查时,使用myList.max()
函数告诉我最长行的索引。
我的问题是,是否有更好/更有效的方法来产生这样的输出?也许甚至有一个我不知道的内置函数能够做到这一点。非常感谢你的帮助。
答案 0 :(得分:2)
def tuple_compare(tup):
"""
Input: 2-tuple of the form (anything, line)
Output: Length of line with trailing newline stripped.
"""
unused_anything, line = tup
return len(line.rstrip('\n'))
with open('filename') as fin:
biggest_line_number, biggest_line = max(enumerate(fin),
key=tuple_compare)
让我们解开一点。 tuple_compare
只取出enumerate
函数中出现的元组,并返回它包含的行的长度(减去可能隐藏在那里的任何换行符)。 enumerate
产生了一堆2元组(lineno, line)
,这就是我们将tuple_compare
中的第二个元素作为行的原因。 max
为我们做了所有其余的繁重工作,并根据key
比较函数返回最大的元组。
在一天结束时,我们只需将元组解压缩为2个部分 - 行号和行文本。
答案 1 :(得分:2)
您可以对key
函数使用max()
参数,并将文件对象视为线上的迭代器:
longest_line = max(myFile, key=len)
它假设最后一行有换行符。否则:
longest_line = max((line.rstrip("\n") for line in myFile), key=len)
如果您还想要一个行号;你可以使用enumerate()
:
number, longest_line = max(enumerate(myFile, 1), key=lambda (i, line): len(line))
答案 2 :(得分:0)
with open('filename') as fin:
max_len, line_num = (max((len(s),i) for i, s in enumerate(fin))
您可能希望在mgilson的回答中使用len(s.rstrip('\r'))
如果您需要以下行中的文字:
with open('filename') as fin:
max_len, line_num, line = (max((len(s),i, s) for i, s in enumerate(fin))
答案 3 :(得分:0)
这是另外几个人给出的基本答案的另一种风格变体。我经常喜欢这种风格,因为它:
利用数据管道的想法:每一步都接收输入流并生成输出流。这个成语遍布整个地方:功能编程; Unix shell;映射简化;等
通常会导致可读代码:我们可以为管道中的每个步骤应用一个有意义的名称,并且生成的代码往往具有平坦,几乎声明的感觉。
< / LI>说明以数据为中心的编程:如果我们以正确的方式转换和组织数据,我们计算的算法方面会缩小到微不足道的比例,甚至达到实际消失的程度 - - 在这种情况下,我们只需在管道的最后一个阶段调用max()
。
对于这方面的许多其他(以及更有趣的)示例,请搜索David Beazley关于迭代器,生成器和协同程序的在线着作。
with open('path/to/file') as fh:
# Each pipeline step is a generator.
stripped = (ln.rstrip('\n') for ln in fh)
lengths = ((len(ln), i, ln) for i, ln in enumerate(stripped))
# The data directly answers our question.
# We get max length, line number, and the line.
print max(lengths)