Python 在列表中迭代列表的一部分

Python 在列表中迭代列表的一部分,python,python-2.7,file-io,list-comprehension,Python,Python 2.7,File Io,List Comprehension,我想打印出文件的前10行,并避免读取任何额外的行。我如何在不阅读整个文件的情况下,通过列表理解做到这一点 我知道我可以这样做: N = 10 with open(path,'rb') as f_in: for line in f_in: print line.strip() N -= 1 if N == 0: break 但我认为列表理解更合适: with open(path,'rb') as f_in:

我想打印出文件的前10行,并避免读取任何额外的行。我如何在不阅读整个文件的情况下,通过列表理解做到这一点

我知道我可以这样做:

N = 10
with open(path,'rb') as f_in:
    for line in f_in:
        print line.strip()
        N -= 1
        if N == 0:
            break
但我认为列表理解更合适:

with open(path,'rb') as f_in:
    [print line for i, line in enumerate(f_in) if i<N]
打开(路径,'rb')作为f_in:
[为i打印行,如果i
当i==N而不是
不必要地继续,只过滤掉多余的行?
有没有一种方法可以限制列表理解到迭代器的程度

您可以使用迭代iterable的切片:

from itertools import islice

with open(path,'rb') as f_in:
    for line in islice(f_in, N):
        print line.strip()
实际上,您可以指定要生成的第一行的索引,甚至是一个步骤(如列表或字符串切片)

请注意,如果您实际上不需要列表,则不应使用列表理解,因为它会消耗内存(在您的情况下,您将文件的所有内容都保留在内存中,如果文件很大,则可能会导致内存不足)。 如果只想在某个对象上迭代一次,请使用生成器表达式:

lines = (line.strip() for line in f_in)
(是的,您只需使用
()
更改
[]
)。 这样可以避免在执行时构建整个列表

是否有合适的方式从列表中打印出来

没有

在python2
中,print
是一个语句,因此它不能出现在表达式中 在python3中,您可以调用
print
,因为它是一个函数,但这是一个非常糟糕的主意

列表理解有一个特定的目的:从给定的iterable构建一个列表。 您将列表扔掉,从而破坏了该语法的全部目的

因此,列表理解中不支持“中断”循环。如果您的代码非常复杂,需要执行
break
,那么最好使用显式
For
循环来编写它

如果您尝试调用
map
:

map(lambda line: print line, lines)
假设可以在
lambda中插入
print

这在python3中甚至失败(它不会打印任何内容)

如果您想编写好的python代码,首要规则是遵循语言设计: 不要混合使用表达式和语句,也就是说:使用表达式返回值,不要滥用它们来产生副作用

当i==N而不是 不必要地继续,只过滤掉多余的行? 有没有一种方法可以限制列表理解到迭代器的程度

您可以使用迭代iterable的切片:

from itertools import islice

with open(path,'rb') as f_in:
    for line in islice(f_in, N):
        print line.strip()
实际上,您可以指定要生成的第一行的索引,甚至是一个步骤(如列表或字符串切片)

请注意,如果您实际上不需要列表,则不应使用列表理解,因为它会消耗内存(在您的情况下,您将文件的所有内容都保留在内存中,如果文件很大,则可能会导致内存不足)。 如果只想在某个对象上迭代一次,请使用生成器表达式:

lines = (line.strip() for line in f_in)
(是的,您只需使用
()
更改
[]
)。 这样可以避免在执行时构建整个列表

是否有合适的方式从列表中打印出来

没有

在python2
中,print
是一个语句,因此它不能出现在表达式中 在python3中,您可以调用
print
,因为它是一个函数,但这是一个非常糟糕的主意

列表理解有一个特定的目的:从给定的iterable构建一个列表。 您将列表扔掉,从而破坏了该语法的全部目的

因此,列表理解中不支持“中断”循环。如果您的代码非常复杂,需要执行
break
,那么最好使用显式
For
循环来编写它

如果您尝试调用
map
:

map(lambda line: print line, lines)
假设可以在
lambda中插入
print

这在python3中甚至失败(它不会打印任何内容)

如果您想编写好的python代码,首要规则是遵循语言设计: 不要混合使用表达式和语句,也就是说:使用表达式返回值,不要滥用它们来产生副作用。

您也可以在需要的行范围内调用file对象:

lines = [f_in.next() for x in range(10)]
这将给出前十行

如果要跳过文件开头的标题或其他行,则使用
next()
非常有用。每次调用file对象上的next时,都会移动到文件的下一行

如果要打印行的内容,可以使用
join()

您还可以在所需的行范围内调用文件对象:

lines = [f_in.next() for x in range(10)]
这将给出前十行

如果要跳过文件开头的标题或其他行,则使用
next()
非常有用。每次调用file对象上的next时,都会移动到文件的下一行

如果要打印行的内容,可以使用
join()


我使用了itertools islice选项并使用了适当的for循环。我会记住你关于遵循语言设计的建议。我使用了itertools islice选项并使用了适当的for循环。我会记住你关于遵循语言设计的建议。