我试图在开括号和闭括号之间按字母顺序对值进行排序,如下所示
(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]]
在此之后,我有点邋..任何帮助是精炼和去分类这个难题是值得赞赏的。非常感谢您花时间帮助我。非常感谢。
答案 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)'