首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python: item for item直到item中的stopterm?

Python: item for item直到item中的stopterm?
EN

Stack Overflow用户
提问于 2008-12-03 14:11:57
回答 6查看 1.9K关注 0票数 3

免责声明:我是python的新手!

如果我想要一个文件的所有行,直到( stopterm:和包括)包含一些字符串列表的行,有没有一种方法可以使用列表语法?我希望会有这样的东西:

代码语言:javascript
运行
复制
usefullines = [line for line in file until stopterm in line]

现在,我有

代码语言:javascript
运行
复制
usefullines = []
for line in file:
    usefullines.append(line)
    if stopterm in line:
        break

这不是世界末日,但是由于Python语法的其余部分是如此简单,我希望有一个1思想>1的Python行映射。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2008-12-03 14:28:58

代码语言:javascript
运行
复制
from itertools import takewhile
usefullines = takewhile(lambda x: not re.search(stopterm, x), lines)

from itertools import takewhile
usefullines = takewhile(lambda x: stopterm not in x, lines)

这里有一种保持停止线的方法:

代码语言:javascript
运行
复制
def useful_lines(lines, stopterm):
    for line in lines:
        if stopterm in line:
            yield line
            break
        yield line

usefullines = useful_lines(lines, stopterm)
# or...
for line in useful_lines(lines, stopterm):
    # ... do stuff
    pass
票数 10
EN

Stack Overflow用户

发布于 2008-12-03 14:26:44

“我希望得到一个1思想>1的Python行映射。”我们不都会喜欢一种以某种方式反映我们自然语言的编程语言吗?

你可以做到这一点,你只需要定义一次你独特的想法。然后你就有了你所希望的1:1映射。

代码语言:javascript
运行
复制
def usefulLines( aFile ):
    for line in aFile:
        yield line
        if line == stopterm:
            break

差不多就是这样。

代码语言:javascript
运行
复制
for line in usefulLines( aFile ):
    # process a line, knowing it occurs BEFORE stopterm.

还有更通用的方法。enum_whileenum_untillassevk回答是对这个简单设计模式的概括。

票数 5
EN

Stack Overflow用户

发布于 2008-12-03 15:48:06

itertools解决方案非常好用。早些时候,我对itertools.groupby这个方便的工具感到惊讶。

但是,如果我不使用itertools的话,我仍然在进行修补。所以它是这样的(虽然有一个假设和一个缺点:文件并不大,而且它分别在各行上进行了一次额外的完整迭代。)

我创建了一个名为“try”的示例文件:

代码语言:javascript
运行
复制
hello
world
happy
day
bye

读取文件并将变量名中的行放入行中后:

代码语言:javascript
运行
复制
lines=open('./try').readlines()

然后

代码语言:javascript
运行
复制
    print [each for each in lines if lines.index(each)<=[lines.index(line) for line in lines if 'happy' in line][0]]

给出结果:

代码语言:javascript
运行
复制
['hello\n', 'world\n', 'happy\n']

代码语言:javascript
运行
复制
print [each for each in lines if lines.index(each)<=[lines.index(line) for line in lines if 'day' in line][0]]

给出结果:

代码语言:javascript
运行
复制
['hello\n', 'world\n', 'happy\n', 'day\n']

所以你得到了最后一行--也包括了停止术语行。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/337223

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档