繁体   English   中英

列出理解以找到匹配的括号

List comprehension to find matching parens

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我正在尝试提出一个列表解析,以匹配打开和关闭括号。 到目前为止,我有这两个语句分别获取打开和关闭parens的两个列表

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)]
2 个回复

就像@Tordek提到的那样,尽管这不是不可能,但它不是很实际,

为了完整起见,下面是一个解决方案:

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

 pt_arr = [ 1 if c == '(' else -1 for i,c in enumerate(my_str ) if c == ')' or c == '(']
idx_arr = [ i for i,c in enumerate(my_str ) if c == ')' or c == '(']

[(idx_arr[strt_idx],idx_arr[strt_idx + [j for j,d in enumerate([ sum(pt_arr[strt_idx:i + 1]) for i,c in enumerate(pt_arr) if i >= strt_idx]) if d == 0][0]]) for strt_idx,f in enumerate(pt_arr) if f == 1]

# [(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项目,但之后会失败,因为append返回None ,并且仅在第二个条件c == ")"时才向结果中添加元素c == ")"是真的,啪最近的位置(从堆栈。

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

2 使用字符串匹配优化列表理解

我有一个看起来像这样的函数: 它只是返回一个整数列表,是的,我尝试过一个生成器,它非常快,但不幸的是它必须是一个列表。 模式可能看起来像这个word1|word2|word3...很多单词:)这是我的优化工作的结果,但它仍然太慢。 我该如何调整性能? 我应该考虑使用Cython吗? ...

3 列表理解中的匹配、过滤和分组

我有一个文件夹,其中包含以下格式的一些图像: 还有其他一些格式: 和这样的文件(我不想匹配): 我想创建一个 jpeg 格式的图像名称列表,不要以 _0 结束并添加它们而不添加它们的扩展名。 我已经制作了这段可以正常工作的代码: 有什么办法可以将这个 for loo 变成列表理解? ...

4 匹配方案中的括号

我正在尝试在方案中编写一些代码。 这是一个做斐波那契的例子: 我的问题更多是关于一般建议。 你到底是如何跟踪所有括号的? 这与其说是易读性的问题(我不在乎),还不如说是把事情做好,而不必在十个不同的地方进行反复试验来添加额外的括号以查看是否有效当这一切都说完了。 是否有更好的方法来更好地处理 ...

6 列表理解,获取匹配的嵌套项目[重复]

这个问题已经在这里有了答案: 如何找到列表交集? 10个答案 我有两个列表,我需要获取匹配项作为集合。 它正确地获取了X,但正如预期的那样,它只给出了嵌套列表(y)中的第一项,而不是匹配的项。 使这项工作并获得匹配的X和Y的最简单方法是什么? 任何 ...

2015-12-04 07:10:14 1 196   python
7 修改RStudio“插入匹配的括号/引用”选项

我真的很喜欢RStudio的插入匹配括号选项,但是我讨厌插入匹配引号选项( https://support.rstudio.com/hc/zh-cn/articles/200549016-Customizing-RStudio#editing )。 有没有一种方法可以修改RStudio,以便插入匹配 ...

2020-08-07 15:24:25 0 16   rstudio
8 使用列表推导找到合并的用户建议

我需要显示合并建议 输入格式 我需要在dict值的p1,p2 ...和e1,e2 ...的基础上显示对此用户的合并建议,可能有多个用户 输出格式 说明 对于键c1,其值为p1和e1,在其他任何键值对中都不存在,因此将c1单独添加到列表中;对于键c2,值p2在键c ...

2017-12-06 11:26:19 1 33   python
暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM