gpt4 book ai didi

python - 列表理解以查找匹配的括号

转载 作者:太空宇宙 更新时间:2023-11-03 21:34:40 24 4
gpt4 key购买 nike

我正在尝试想出一个可以匹配左括号和右括号的列表理解。到目前为止,我有这两个语句,它们分别获取两个左括号和右括号的列表

my_str = "hanz(and(franz/bob())+ 7) + tom(2)"

获取左括号的 idx:

[ i for i,c in enumerate(my_str) if c == '(']

# [4, 8, 18, 31]

获取右括号的 idx:

[ i for i,c in enumerate(my_str) if c == ')']

# [19, 20, 24, 33]

我想要的是一种方便的理解,它可以给我一个与每个匹配对的括号相对应的对列表

[ ???? for i,c in enumerate(my_str) ???]

# [(4,24), (8,20), (18,19), (31,33)]

最佳答案

正如评论中提到的,执行此操作的正确且简单的方法是使用堆栈:

my_str = "hanz(and(franz/bob())+ 7) + tom(2)"
stack = []
parens = []
for i, c in enumerate(my_str):
if c == "(":
stack.append(i)
elif c == ")":
parens.append((stack.pop(), i))
print(parens) # [(18, 19), (8, 20), (4, 24), (31, 33)]

但是,如果您更看重单行代码而不是可读性或编码约定,您也可以将其塞入具有副作用的列表推导式中:

stack = []
parens = [(stack.pop(), i) for i, c in enumerate(my_str)
if c == "(" and stack.append(i) or c == ")"]
print(parens) # [(18, 19), (8, 20), (4, 24), (31, 33)]

这利用了 andor 是短路求值的事实,因此只有在 c 时才会附加项== "(",但随后失败,因为 append 返回 None,并且仅在第二个条件 c == 时才将元素添加到结果中")" 为 true,从堆栈中弹出最新 ( 的位置。

至少,这并不是完全滥​​用列表推导式,因为结果没有被丢弃,而是实际上是期望的结果,并且它可能仍然比 you 的三个列表推导式更容易理解。有(尽管这些工作没有副作用),但是“方便”的更好的解决方案是:将其设为一个函数,而不是它有多少行。

关于python - 列表理解以查找匹配的括号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53311626/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com