2

我正在逐行读取文件,并以我想要的方式用 line.split(',') 将其分开。现在我想标记、复制到列表或执行以下功能:

包含字符串“THIS”但不包含“THAT”的行。

我正在拍摄看起来像这样的东西:

if any(('THIS' in s for s in csvLine) if any('THAT' **!in** s for s in csvLine):
        print csvLine

但这根本不是好的语法。我想我在使用列表理解时不知所措,但是由于这个答案,我之前已经成功地做到了。

我确实有一个使用下面代码的工作解决方案,但我觉得有更好的东西:

    if any('THAT' in s for s in csvLine):
        print "do nothing"
    elif any('THIS' in s for s in csvLine):
        print "do something"
    else:
        print "do nothing"

如何将这些 if-else 语句的逻辑压缩成更漂亮的 Pythonic 代码?

这是我实际的、非通用的、简单的英语问题:如果一行包含 CHAT 和 TRANSFER,那么它并不重要。如果它仅包含 CHAT,则不重要。如果它只包含 TRANSFER 而不是 CHAT 这个词,那么值得注意,我想对这条线做点什么。如何找到带有 TRANSFER 字样的行,但没有 CHAT 字样?

4

3 回答 3

4

不确定我是否完全理解 - 为什么需要遍历该行?这似乎会更好:

if 'this' in csvLine and not 'that' in csvLine:
    do_something()
于 2012-06-11T19:00:39.943 回答
1
if any('THIS' in s for s in csvLine) and all('THAT' not in s for s in csvLine):

是相同的

if any('THIS' in s for s in csvLine) and not any('THAT' in s for s in csvLine):

一旦找到“THIS”,“THIS”部分将停止迭代,而“THAT”将在找到“THAT”后立即停止迭代。一个或两个迭代可能必须完成。

于 2012-06-11T18:59:29.193 回答
1

根据您链接到的问题,稍作修改:

csv_line = ["Has CHAT", "Has TRANSFER", "Has CHAT and TRANSFER"]
transfers = [s for s in csv_line if "TRANSFER" in s and "CHAT" not in s]
print transfers

>>> ['Has TRANSFER']
于 2012-06-11T19:02:23.233 回答