替换任意深度的嵌套列表中的元素



在隔离期间,我正在为我的公司制作一个"最可爱的宠物支架",我很困惑如何在一轮比赛结束后更新下一轮的竞争对手(有人获胜(。

假设我的获胜者是3,下一轮是:

[[3,14],[6,11]]

后一轮为:

[[2,[7,10]],[[3,14],[6,11]]

我想用其中的胜利者来替换子节点,以反映现在只剩下胜利者的事实:

[[3,14],[6,11]-->[3,[6,11]

[[2,[7,10]],[[3,14],[6,11]]-->[[2,+7,10]][3,[6、11]]]

我想出了一些代码,但它不能正常工作

[[3,14],[6,11]]->[[3],[6,11](关闭,但没有雪茄(

[[2,[7,10]],[[3,14],[6,11]]-->[[2,+7,10]]][3,14][6,12]]](无变化(

def traverse(traversed_element_of_list_of_lists, winner):
rebuild = []
if isinstance(traversed_element_of_list_of_lists, list):
for value in traversed_element_of_list_of_lists:
if isinstance(value, int):
continue#rebuild.append(value)
if winner in value:
rebuild.append([winner])
else:
rebuild.append(value)
traverse(value, winner)
return rebuild

SO上有很多关于替换已定义形状的嵌套列表中的项的答案,也有关于如何遍历和展平任意深度的嵌套列表的答案,但我似乎找不到任何关于如何替换任意深度列表中的项目的答案。

谢谢你的帮助!

您的递归有3种情况:

  1. 基本情况下,嵌套对象并不是真正嵌套的,它只是一个数字。直接返回
  2. 特殊情况下,获胜者在列表中,在这种情况下,您只希望返回单个获胜者的号码
  3. 递归情况下,通过递归遍历每个元素来返回一个新列表

将其作为递归函数组合在一起:

def traverse(nested, winner):
if not isinstance(nested, list):
return nested
if winner in nested:
return winner
return [traverse(o, winner) for o in nested]

这将在您的示例中产生所需的结果。

traverse([[3, 14], [6, 11]], 3)                                                                                                                                                                                                     
# [3, [6, 11]]
traverse([[2, [7, 10]], [[3, 14], [6, 11]]], 3)                                                                                                                                                                                     
# [[2, [7, 10]], [3, [6, 11]]]

最新更新