我有一个数组/字符串/列表(长度= n)需要排序,而不是完全(即不是从0到(n-1)),而是从指定的索引(k到(n-1))到最后:
input_str = 'edayzadr'
sorted_str = 'edazyrda'
排序只应在index(3,7)之间进行。
答案 0 :(得分:2)
您可以使用切片来引用要排序的子字符串(使用sorted()
),然后重新组合前缀,排序的子字符串和后缀。
有几种方法可以进行重组,一种是使用str.format()
:
str = 'edayzadr'
sorted_str = '{}{}{}'.format(str[:3], ''.join(sorted(str[3:7])), str[7:])
另一种方法是使用join()
:
sorted_str = ''.join((str[:3], ''.join(sorted(str[3:7])), str[7:]))
答案 1 :(得分:1)
您必须使用切片将分类应用于子部分,然后重新加入部分:
return input_str[:3] + ''.join(sorted(input_str[3:7])) + input_str[7:]
因为字符串上的sorted()
返回单个字符,所以您需要重新加入这些字符。
您可以将通常的排序参数应用于sorted()
,例如反转。辅助函数可以使这些以及开始和结束索引的处理更容易:
def sort_section(string, start, stop, **kwargs):
mid = ''.join(sorted(string[start:stop], **kwargs))
return string[:start] + mid + string[stop:]
请注意,您的示例正在从索引3排序到索引 8 (Python切片是开放式的,不包括结束索引),并且颠倒排序:
>>> def sort_section(string, start, stop, **kwargs):
... mid = ''.join(sorted(string[start:stop], **kwargs))
... return string[:start] + mid + string[stop:]
...
>>> sort_section('edayzadr', 3, 8, reverse=True)
'edazyrda'
对于元组,您需要在连接之前将sorted()
输出转换回元组:
input_tup[:3] + tuple(sorted(input_tup[3:7])) + input_tup[7:]
对于列表对象,您可以省略str.join()
调用;您可以将列表分配回与列表相同的片段,至少是可变的:
sorted_lst[3:7] = sorted(input_lst[3:7])
由于您现在有3种不同的技术可以重新连接3个字符串部分(我的连接,以及mhawke' str.format
和str.join
选项),这里还有一个快速基准来比较那些:
>>> from timeit import timeit
>>> def concat(s):
... return s[:3] + ''.join(sorted(s[3:7])) + s[7:]
...
>>> def format(s):
... return '{}{}{}'.format(s[:3], ''.join(sorted(s[3:7])), s[7:])
...
>>> def join(s):
... return ''.join((s[:3], ''.join(sorted(s[3:7])), s[7:]))
...
>>> timeit("concat('edayzadr')", 'from __main__ import concat')
1.0208790302276611
>>> timeit("format('edayzadr')", 'from __main__ import format')
1.322662115097046
>>> timeit("join('edayzadr')", 'from __main__ import join')
1.1326570510864258