我正在逐行读取文件,我已经按照我想要的方式将它与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?
答案 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']