对于一个赋值,我们被要求创建一个函数,该函数将反转任意嵌套列表中的所有元素。所以函数的输入应该返回如下内容:
>>> seq = [1,[2,[3]]]
>>> print arb_reverse(seq)
[[[3],2],1]
>>> seq = [9,[[],[0,1,[[],[2,[[],3]]]],[],[[[4],5]]]]
>>> print arb_reverse(seq)
[[[[5,[4]]],[],[[[[3,[]],2],[]],1,0],[]],9]
我想出了一个效果很好的递归解决方案:
def arb_reverse(seq):
result = []
for element in reversed(seq):
if not is_list(element):
result.append(element)
else:
result.append(arb_reverse(element))
return result
但是对于一些个人挑战,我想创建一个不使用递归的解决方案。这种尝试的一个版本导致了一些我不理解的奇怪行为。为了澄清起见,我没想到这个版本能正常工作,但由此产生的输入突变没有意义。这是有问题的迭代版本:
def arb_reverse(seq):
elements = list(seq) #so input is not mutated, also tried seq[:] just to be thorough
result = []
while elements:
item = elements.pop()
if isinstance(item, list):
item.reverse() #this operation seems to be the culprit
elements += item
else:
result.append(item)
return result
这将返回一个扁平的半反向列表(有点预期),但有趣的部分是它对输入的作用(不是预期的)......
>>> a = [1, [2, [3]]]
>>> arb_reverse(a)
[2, 3, 1]
>>> a
[1, [[3], 2]]
>>> p = [1, [2, 3, [4, [5, 6]]]]
>>> print arb_reverse(p)
[2, 3, 4, 5, 6, 1]
>>> print p
[1, [[[6, 5], 4], 3, 2]]
我的印象是,通过将输入中包含的值传递给使用list()
或的变量,input[:]
我elements
将避免改变输入。然而,后来的一些打印声明表明,反向方法有助于改变原始列表。这是为什么?