如何优雅地链接

时间:2012-02-14 02:33:16

标签: python

我有一段奇怪的代码。这很臭,但如果更清楚的话,我想不出办法。

我要做的是从左侧列表的尾部或右侧列表的头部删除最大的项目。我最终得到了这段代码。

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 个答案:

答案 0 :(得分:6)

改变您的条件,并消除多余的条款。

if (not left) or (right and (len(left[-1]) < len(right[0]))):
  right.pop(0)
else:
  left.pop(-1)

答案 1 :(得分: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 rightleft.pop(-1)而不是right.pop(0)。但是,无论如何,这都是一个错误......

答案 2 :(得分:1)

一些hacky方法(因为它可以扩展到2个以上的列表,因此更加通用):

_, lst, i = max((len(lst[i]), lst,i) for lst,i 
                in ((left, -1), (right, 0)) if lst)
lst.pop(i)

答案 3 :(得分:1)

left_tail_size = len(left[-1]) if left else 0
right_head_size = len(right[0]) if right else 0

if left_tail_size >= right_head_size:
  left.pop(-1)
else:
  right.pop(0)