【问题标题】:sorting values between open and closed parenthesis iteratively in python在python中迭代地对开括号和闭括号之间的值进行排序
【发布时间】:2017-09-23 03:05:09
【问题描述】:

我正在尝试在左括号和右括号之间按字母顺序对值进行排序,如下所示

(m,b,l,a(d,g,c(l,e)),f(k,g,h(i)),j) 我想要一个的输出

(a(c(e,l),d,g),b,f(g,h(i),k),j,l,m) 排序。

我已经完成了一些编码,但它变得古怪。我能够对最里面的括号进行排序,但无法继续。

indexofparen = []
for i, c in enumerate(s):
    if c == "(":
        indexofparen.append(i)
##print(indexofparen)
closeparen = []
for i, c in enumerate(s):
    if c == ")":
        closeparen.append(i)
##print(closeparen)
parenindex=s.rindex("(")
##print(parenindex)
matchparen=s.index(")")-1
##print(matchparen)
list_val = s[s.rindex("(")+1:s.index(")")].split(",")
##print("Before:", list_val)
for passnum in range(len(list_val)-1, 0, -1):
    for i in range(passnum):
        if list_val[i] > list_val[i+1]:
          list_val[i], list_val[i+1] = list_val[i+1], list_val[i]
##print(list_val)
s1=s[:parenindex] + "(" + ','.join(str(e) for e in list_val) + ")" + s[matchparen:]
##print(s1)
s2 = s[indexofparen[1]+1:closeparen[2]]

在这之后,我有点发疯了。任何帮助都是为了完善和解决这个难题,我们将不胜感激。非常感谢您花时间帮助我。非常感谢。

【问题讨论】:

标签: python string sorting recursion parentheses


【解决方案1】:

这很有趣:

In [55]: def sort_key(t):
    ...:     if isinstance(t, tuple):
    ...:         return t
    ...:     return (t,)
    ...:

In [56]: def recursive_sort(x):
    ...:     gen = (recursive_sort(t) if isinstance(t, tuple) else t for t in x)
    ...:     return tuple(sorted(gen, key=sort_key))
    ...:

In [57]: print(x)
('m', 'b', 'l', 'a', ('d', 'g', 'c', ('l', 'e')), 'f', ('k', 'g', 'h', ('i',)), 'j')

In [58]: print(recursive_sort(x))
('a', 'b', ('c', 'd', ('e', 'l'), 'g'), 'f', ('g', 'h', ('i',), 'k'), 'j', 'l', 'm')

“键”在key 参数中,它确保您正在比较元组并处理排序的字典方面。然后,它只是递归地对元素进行排序,无论它们是否是元组。

编辑

哎呀!刚刚意识到您想对 string 进行排序。好吧,既然我已经对我的解决方案产生了依恋,这里有一个丑陋的黑客来挽救它:

In [60]: import re

In [61]: import ast

In [62]: def to_tuple(s):
    ...:     s = re.sub(r"([a-zA-Z])([\(\)])",r"\1,\2",s)
    ...:     s = re.sub(r"([a-zA-Z])",r"'\1'",s)
    ...:     return ast.literal_eval(s)
    ...:

In [63]: def to_string(t):
    ...:     return str(t).replace("',)", "')").replace("'",'')
    ...:

In [64]: s = "(m,b,l,a(d,g,c(l,e)),f(k,g,h(i)),j)"

最后:

In [65]: print(t)
('m', 'b', 'l', 'a', ('d', 'g', 'c', ('l', 'e')), 'f', ('k', 'g', 'h', ('i',)), 'j')

In [66]: to_string(recursive_sort(t))
Out[66]: '(a, b, (c, d, (e, l), g), f, (g, h, (i), k), j, l, m)'

【讨论】:

  • 这是我运行您的代码时得到的输出,而不是您显示的输出。 'x=(m,b,l,a(d,g,c(l,e)),f(k,g,h(i)),j) print(x) ((, (, (, ( , (, ), ), ), ), ), ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, a, b, c, d, e, f, g, g, h , i, j, k, l, l, m)
  • 这是我运行您的代码时得到的输出,而不是您显示的输出。 print(x) x=(m,b,l,a(d,g,c(l,e)),f(k,g,h(i)),j) print(to_string(recursive_sort(x))) ((, (, (, (, (, ), ), ), ), ), ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, a, b, c, d, e, f, g, g, h, i, j, k, l, l, m)
  • @Xavier 这些不是可重现的示例...x=(m,b,l,a(d,g,c(l,e)),f(k,g,h(i)),j) 不是有效的 Python,除非定义了 abc 等...
猜你喜欢
  • 1970-01-01
  • 2021-01-17
  • 2019-12-17
  • 2020-08-17
  • 1970-01-01
  • 2017-07-05
  • 1970-01-01
  • 2012-11-13
  • 1970-01-01
相关资源
最近更新 更多