替换任意深度的嵌套列表中的元素
Replace element in nested lists of arbitrary depth
我正在隔离期间为我的公司制作'cutest pet bracket',我很困惑如何在玩完一轮(有人赢)后更新后续轮次的竞争对手。
假设我的赢家是 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, 11]]](无变化)
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种情况:
- 基本情况,其中嵌套对象并未真正嵌套,它只是一个数字。 Return直接说。
- 特殊情况,获胜者在列表中,在这种情况下,您只需要单个获胜者号码 returned。
- 递归情况,其中您通过递归遍历每个元素来return一个新列表。
将其合并为一个递归函数:
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]]]
我正在隔离期间为我的公司制作'cutest pet bracket',我很困惑如何在玩完一轮(有人赢)后更新后续轮次的竞争对手。
假设我的赢家是 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, 11]]](无变化)
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种情况:
- 基本情况,其中嵌套对象并未真正嵌套,它只是一个数字。 Return直接说。
- 特殊情况,获胜者在列表中,在这种情况下,您只需要单个获胜者号码 returned。
- 递归情况,其中您通过递归遍历每个元素来return一个新列表。
将其合并为一个递归函数:
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]]]