【发布时间】:2011-08-13 07:26:27
【问题描述】:
我想要做的是,给定一个包含任意数量的其他嵌套列表的列表,递归遍历嵌套列表中的最后一个值,直到达到最大深度,然后将一个值附加到那个清单。举个例子可能会更清楚:
>>> nested_list1 = [1, 2, 3, [4, 5, 6]]
>>> last_inner_append(nested_list1, 7)
[1, 2, 3, [4, 5, 6, 7]]
>>> nested_list2 = [1, 2, [3, 4], 5, 6]
>>> last_inner_append(nested_list2, 7)
[1, 2, [3, 4], 5, 6, 7]
以下代码有效,但对我来说似乎过于棘手:
def add_to_inner_last(nested, item):
nest_levels = [nested]
try:
nest_levels.append(nested[-1])
except IndexError: # The empty list case
nested.append(item)
return
while type(nest_levels[-1]) == list:
try:
nest_levels.append(nest_levels[-1][-1])
except IndexError: # The empty inner list case
nest_levels[-1].append(item)
return
nest_levels[-2].append(item)
return
我喜欢它的一些地方:
- 有效
- 它处理列表末尾的字符串情况,以及空列表的情况
我不喜欢它的一些地方:
- 我必须检查对象的类型,因为字符串也是可索引的
- 索引系统感觉太神奇了——我明天就看不懂了
- 使用附加到引用列表会影响所有引用这一事实感觉非常聪明
我对此有一些一般性的问题:
- 一开始还担心追加到
nest_levels会占用空间,后来才发现这大概只是一个引用,并没有创建新的对象吧? - 此代码纯粹是产生副作用(它总是返回
None)。我应该担心吗?
基本上,虽然这段代码有效(我认为......),但我想知道是否有更好的方法来做到这一点。更好我的意思是更清晰或更pythonic。可能有更明确的递归?我很难定义一个停止点或一种在不产生副作用的情况下执行此操作的方法。
编辑:
明确一点,这个方法还需要处理:
>>> last_inner_append([1,[2,[3,[4]]]], 5)
[1,[2,[3,[4,5]]]]
和:
>>> last_inner_append([1,[2,[3,[4,[]]]]], 5)
[1,[2,[3,[4,[5]]]]]
【问题讨论】: