反转 python 中的嵌套列表
reversing a nested list in python
您好,我正在尝试以相反的顺序转换嵌套列表。
这是我的代码:
def reverse_(items):
items = items[::-1]
new_l = []
for item in items:
if type(item) == list:
item.reverse()
new_l.append(item)
else:
new_l.append(item)
return new_l
print(reverse_reversed([1, [2, 3, 4, 'yeah'], 5] ))
returns : [5, ['yeah', 4, 3, 2], 1]
这是正确的
但是 print(reverse_reversed([42, [99, [17, [33, ['boo!']]]]])
returns : [[[17, [33, ['boo!']]], 99], 42]
应该是这样的: [[[[['boo!'], 33], 17], 99], 42]
您似乎想要递归地反转列表,而不仅仅是嵌套一次。这意味着您需要进行递归函数调用,即它需要调用自身。
def recursive_reversed(items):
if isinstance(items, list):
return [recursive_reversed(item) for item in reversed(items)]
return items
备注:
- 我使用
isinstance
检查而不是 type(item) ==
。这通常是您想要的,这意味着 list
的子类也将被反转(尽管它们将是常规列表)。
- 没有制作额外的副本:
reversed
以相反的顺序遍历原始列表。
- 没有原地反转:如果您在调用您的实现后查看原始列表的内容,您会看到它的子列表也将被反转。
- 我使用了列表理解,它通常优于“创建一个空列表,循环其他内容,每次迭代向该列表附加内容”。
- 我的函数调用自身作为一种分而治之的形式。
因为你做了items[::-1]
,所以列表会变成这样
[[99, [17, [33, ['boo!']]]], 42]
正如您在列表中看到的,只有两项 [99, [17, [33, ['boo!']]]]
和 42
。所以你 new 如果列表中有更多列表,你将必须检查你是否正在迭代列表中没有未反转的列表。但是你不能用一个简单的 for 循环来做到这一点。
如果您实际上不需要反转副本而只想反转结构本身:
def reverse(items):
if isinstance(items, list):
items.reverse()
for item in items:
reverse(item)
演示:
>>> a = [42, [99, [17, [33, ['boo!']]]]]
>>> reverse(a)
>>> a
[[[[['boo!'], 33], 17], 99], 42]
你也可以用 return items
结束它以获得结果 returned:
>>> reverse([42, [99, [17, [33, ['boo!']]]]])
[[[[['boo!'], 33], 17], 99], 42]
虽然同时修改和 return 有点不寻常,但有些人不会喜欢它。
您好,我正在尝试以相反的顺序转换嵌套列表。
这是我的代码:
def reverse_(items):
items = items[::-1]
new_l = []
for item in items:
if type(item) == list:
item.reverse()
new_l.append(item)
else:
new_l.append(item)
return new_l
print(reverse_reversed([1, [2, 3, 4, 'yeah'], 5] ))
returns :[5, ['yeah', 4, 3, 2], 1]
这是正确的但是
print(reverse_reversed([42, [99, [17, [33, ['boo!']]]]])
returns :[[[17, [33, ['boo!']]], 99], 42]
应该是这样的:[[[[['boo!'], 33], 17], 99], 42]
您似乎想要递归地反转列表,而不仅仅是嵌套一次。这意味着您需要进行递归函数调用,即它需要调用自身。
def recursive_reversed(items):
if isinstance(items, list):
return [recursive_reversed(item) for item in reversed(items)]
return items
备注:
- 我使用
isinstance
检查而不是type(item) ==
。这通常是您想要的,这意味着list
的子类也将被反转(尽管它们将是常规列表)。 - 没有制作额外的副本:
reversed
以相反的顺序遍历原始列表。 - 没有原地反转:如果您在调用您的实现后查看原始列表的内容,您会看到它的子列表也将被反转。
- 我使用了列表理解,它通常优于“创建一个空列表,循环其他内容,每次迭代向该列表附加内容”。
- 我的函数调用自身作为一种分而治之的形式。
因为你做了items[::-1]
,所以列表会变成这样
[[99, [17, [33, ['boo!']]]], 42]
正如您在列表中看到的,只有两项 [99, [17, [33, ['boo!']]]]
和 42
。所以你 new 如果列表中有更多列表,你将必须检查你是否正在迭代列表中没有未反转的列表。但是你不能用一个简单的 for 循环来做到这一点。
如果您实际上不需要反转副本而只想反转结构本身:
def reverse(items):
if isinstance(items, list):
items.reverse()
for item in items:
reverse(item)
演示:
>>> a = [42, [99, [17, [33, ['boo!']]]]]
>>> reverse(a)
>>> a
[[[[['boo!'], 33], 17], 99], 42]
你也可以用 return items
结束它以获得结果 returned:
>>> reverse([42, [99, [17, [33, ['boo!']]]]])
[[[[['boo!'], 33], 17], 99], 42]
虽然同时修改和 return 有点不寻常,但有些人不会喜欢它。