我有一段奇怪的代码。这很臭,但如果更清楚的话,我想不出办法。
我要做的是从左侧列表的尾部或右侧列表的头部删除最大的项目。我最终得到了这段代码。
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)
条件的主体是彼此完全相同的,哎呀。
是否有一种优雅的方法来重构此代码以最大限度地减少重复?
答案 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 right
,left.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)