如何在Python中将仅单个条件不同的重复if语句简化为单一实现
if not and print Statements Original Question
我希望简化以下Python代码,避免重复编写
if not语句和if not语句仅多了一个条件curAccession == data[5],而两次的代码如下:
fileName = data[6] if data[6][0] == '.': fileName = data[5] + data[6] if not (curIP == data[0] and curDate == data[1] and curAccession == data[5] and curExtention == data[6]): print('%s\t%s' % (data[0] + "," + fileName, data[1])) else: if not (curIP == data[0] and curDate == data[1] and curExtention == data[6]): print('%s\t%s' % (data[0] + "," + fileName, data[1]))
Solution
当然可以简化啦!咱们先拆解一下你的代码逻辑,再一步步优化:
第一步:先揪出隐藏的逻辑问题
仔细看你的else分支:当第一个if not的条件不成立时,意味着curIP == data[0]、curDate == data[1]、curAccession == data[5]、curExtention == data[6]全部为真,这时候再判断not (curIP == data[0] and curDate == data[1] and curExtention == data[6])——这个条件肯定是假的,所以else里的print其实永远不会执行。不过先不管这个,咱们先解决你提出的「避免重复代码」的核心需求。
第二步:提取重复逻辑,减少冗余
1. 封装重复的print语句
把重复的打印逻辑做成一个小函数,这样只需要写一次,后续直接调用就行:
def print_log(ip, filename, date): print(f"{ip},{filename}\t{date}") # 用f-string比%格式化更直观哦
2. 简化fileName的赋值
原来的两行if判断可以用三元表达式简化成一行:
fileName = f"{data[5]}{data[6]}" if data[6].startswith('.') else data[6]
3. 提取重复的条件判断
把那些重复的比较条件提取成变量,不仅能减少重复代码,还能让逻辑更清晰:
ip_matches = curIP == data[0] date_matches = curDate == data[1] ext_matches = curExtention == data[6] accession_matches = curAccession == data[5]
第三步:合并判断条件
现在我们可以把两个if not的逻辑合并成一个判断。原代码的打印场景是:
- 要么「四个条件不全匹配」,要么「四个条件全匹配但三个核心条件不匹配」(但后面这个场景不可能发生)
所以最终简化后的完整代码是:
def print_log(ip, filename, date): print(f"{ip},{filename}\t{date}") # 简化fileName赋值 fileName = f"{data[5]}{data[6]}" if data[6].startswith('.') else data[6] # 提取条件变量 ip_matches = curIP == data[0] date_matches = curDate == data[1] ext_matches = curExtention == data[6] accession_matches = curAccession == data[5] # 合并判断逻辑 if not (ip_matches and date_matches and accession_matches and ext_matches): print_log(data[0], fileName, data[1])
如果你的原逻辑其实是想表达「当IP、日期、扩展名匹配,但 accession 不匹配时也打印」,那我们可以调整判断条件为:
# 当IP、日期、扩展名匹配,但accession不匹配;或者IP/日期/扩展名至少一个不匹配时,打印 if not (ip_matches and date_matches and ext_matches) or (ip_matches and date_matches and ext_matches and not accession_matches): print_log(data[0], fileName, data[1]) # 进一步简化这个条件 if not (ip_matches and date_matches and ext_matches and accession_matches): print_log(data[0], fileName, data[1])
哎,你会发现这个简化后的条件和最开始的其实一样——因为上面的复杂条件最终等价于「四个条件不全匹配」。
内容的提问来源于stack exchange,提问作者Giannis Lps

