如何优雅地链接if else

4 投票
4 回答
5782 浏览
提问于 2025-04-17 12:59

我有一段奇怪的代码。虽然它看起来不太好,但我想不出更清晰的写法。

我想做的事情是从左边列表的末尾或者右边列表的开头,移除最大的那个项目。最后我写出了这段代码。

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)

撰写回答