列表理解:包含这个而不是那个(Python)

时间:2012-06-11 18:57:00

标签: python list-comprehension

我正在逐行读取文件,我已经按照我想要的方式将它与line.split(',')分开了。现在我要标记,复制到列表或执行函数:

一行包含字符串'THIS',但不包含'THAT'。

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

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

但这根本不是好语法。我想我是在使用列表理解,但我已成功完成它,感谢this answer

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

    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?

3 个答案:

答案 0 :(得分:4)

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

if 'this' in csvLine and not 'that' in csvLine:
    do_something()

答案 1 :(得分: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'后立即停止迭代。有可能,必须完成一个或两个迭代。

答案 2 :(得分:0)

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

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']