假设我有一个排序的字符串列表,如:
['A', 'B' , 'B1', 'B11', 'B2', 'B21', 'B22', 'C', 'C1', 'C11', 'C2']
Run Code Online (Sandbox Code Playgroud)
现在我想基于Bs 的尾随数值进行排序- 所以我有:
['A', 'B' , 'B1', 'B2', 'B11', 'B21', 'B22', 'C', 'C1', 'C11', 'C2']
Run Code Online (Sandbox Code Playgroud)
一种可能的算法是对正则表达式进行散列,例如regex = re.compile(ur'(B)(\d*))找到第一个和最后一个的索引B,对列表进行切片,使用正则表达式的第二个组对切片进行排序,然后插入已排序的切片.然而,这似乎太麻烦了.如果它与正则表达式不匹配并且只对匹配的项(子列表)进行排序,是否有办法编写一个"将项目保留在原位"的关键函数?
注意:以上只是一个例子 ; 我不一定知道模式(或者我也可能想要对C进行排序,或者任何具有尾随数字的字符串).理想情况下,我正在寻找一种解决一般问题的方法,即只对与给定标准匹配的子序列进行排序(或者失败,只是满足给定前缀的特定标准后跟一串数字的那些).
这个问题实际上是改编自Mat.S先前提出的问题(图片).虽然它已被删除,但我认为这是一个很好的问题,所以我将它与更清晰的要求和我自己的解决方案重新发布.
给出一个字母和数字列表,比方说
['a', 2, 'b', 1, 'c', 3]
Run Code Online (Sandbox Code Playgroud)
要求是按升序对数字进行排序,按降序对字母进行排序,而不改变字母和数字的相对位置.我的意思是,如果未排序的列表是:
[L, D, L, L, D] # L -> letter; # D -> digit
Run Code Online (Sandbox Code Playgroud)
然后,排序列表也必须是
[L, D, L, L, D]
Run Code Online (Sandbox Code Playgroud)
字母和数字做并不一定替代常规模式-它们可以出现在任意顺序
排序后 - 数字递增,字母降序.
所以对于上面的例子,输出是
['c', 1, 'b', 2, 'a', 3]
Run Code Online (Sandbox Code Playgroud)
另一个例子:
In[]: [5, 'a', 'x', 3, 6, 'b']
Out[]: [3, 'x', 'b', 5, 6, 'a']
Run Code Online (Sandbox Code Playgroud)
这样做有什么好办法?