如何优雅地链接if else
我有一段奇怪的代码。虽然它看起来不太好,但我想不出更清晰的写法。
我想做的事情是从左边列表的末尾或者右边列表的开头,移除最大的那个项目。最后我写出了这段代码。
if not left:
right.pop(0)
elif not right:
left.pop(-1):
elif len(left[-1]) < len(right[0]):
right.pop(0)
else:
left.pop(-1)
条件里的内容完全一样,真让人不舒服。
有没有什么优雅的方法来重构这段代码,减少重复的部分呢?
4 个回答
1
这里有一种比较“黑科技”的方法(其实它也有点通用,因为可以处理超过两个列表的情况):
_, lst, i = max((len(lst[i]), lst,i) for lst,i
in ((left, -1), (right, 0)) if lst)
lst.pop(i)
4
这样做可以吗?
>>> left_len = len(left[-1]) if left else -1
>>> right_len = len(right[0]) if right else -1
>>> right.pop(0) if right_len > left_len else left.pop(-1)
9
这里的行为有点不同,如果not left and not right
,那么会执行left.pop(-1)
,而不是right.pop(0)
。不过无论如何,这样做都是错误的……
6
把你的条件连接起来,去掉那些多余的部分。
if (not left) or (right and (len(left[-1]) < len(right[0]))):
right.pop(0)
else:
left.pop(-1)