如何在指定的索引之间对数组进行排序

时间:2015-09-06 08:11:04

标签: python python-2.7 sorting

我有一个数组/字符串/列表(长度= n)需要排序,而不是完全(即不是从0到(n-1)),而是从指定的索引(k到(n-1))到最后:

input_str = 'edayzadr'
sorted_str = 'edazyrda'

排序只应在index(3,7)之间进行。

2 个答案:

答案 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.formatstr.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