python中对开括号和闭括号之间的值进行迭代排序

python中对开括号和闭括号之间的值进行迭代排序,python,string,sorting,recursion,parentheses,Python,String,Sorting,Recursion,Parentheses,我试图按字母顺序在开括号和闭括号之间对值进行排序,如下所示 (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

我试图按字母顺序在开括号和闭括号之间对值进行排序,如下所示

(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]]
在这之后,我有点疯了。任何有助于改进和整理这一难题的方法都将不胜感激。非常感谢你花时间帮助我。非常感谢。

这很有趣:

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”位于
key
参数中,它确保您比较元组,并考虑排序的词典方面。然后,如果元素是元组或不是元组,它只是递归地对元素进行排序

编辑 哎呀!刚意识到你想对字符串排序。好吧,既然我越来越喜欢我的解决方案,这里有一个丑陋的黑客来拯救它:

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)x=(m,b,l,a(d,g,c(l,e)),f(k,g,h(i)),j)打印(到字符串(递归排序(x))(,(,(,(,,,(,,,,,),,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,a,b,c,d,e,f,g,g,g,h,i,j,k,l,m)@Xavier
x=(m,b,l,a(d,g,c(l,e)),f(k,g,h(i)),j)
是无效的Python,除非定义了
a
b
c
等。。。