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

时间:2017-04-25 22:12:05

标签: 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(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]]

在此之后,我有点邋..任何帮助是精炼和去分类这个难题是值得赞赏的。非常感谢您花时间帮助我。非常感谢。

1 个答案:

答案 0 :(得分:3)

这很有趣:

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)'