gpt4 book ai didi

python - 在列表理解中迭代列表的一部分

转载 作者:行者123 更新时间:2023-11-28 22:49:08 25 4
gpt4 key购买 nike

我想打印出文件的前 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]

但是,由于 print 语句,这不起作用,所以我最终遇到了这个烂摊子:

with open(path,'rb') as f_in:
lines = [line.strip() for i, line in enumerate(f_in) if i<N]
for line in lines:
print line

我的问题的真正要点是当 i==N 时如何让列表理解停止而不是不必要地继续并且只过滤掉额外的行?

有没有办法限制列表推导式进入迭代器的程度?是否有适当的方法从列表理解中打印出来?我是 python 的新手,所以我正在尝试学习如何以正确的方式做事,而不仅仅是我能想到的第一种方式。我希望能够以 pythonic 方式编写它。

最佳答案

how do you get the list comprehension to stop when i==N instead of needlessly continuing and only filtering out the extra lines? Is there a way to limit how far into an iterator a list comprehension will go?

您可以使用 itertools.islice迭代可迭代对象的一部分:

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)

(是的,您只需将 [] 更改为 ())。这避免了在执行时构建整个列表。

is there an appropriate way to print out from a list comprehension?

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

List-comprehensions 有一个特定的目的:从给定的可迭代对象构建一个列表。您正在丢弃列表,从而破坏了该语法的全部目的。

出于这个原因,不支持在列表理解中“打破”循环。如果您的代码复杂到需要 break,您最好使用明确的 for 循环来编写它。

如果您尝试执行类似调用 map 的操作,情况也是如此:

map(lambda line: print line, lines)

假设可以在 lambda 中插入 print

这甚至在 python3 中失败(它不会打印任何东西)。

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

关于python - 在列表理解中迭代列表的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24232711/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com