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

Python 如何在指定的索引之间对数组进行排序,python,python-2.7,sorting,Python,Python 2.7,Sorting,我有一个数组/字符串/列表(长度=n),需要对其进行排序,不是完全排序(即不是从0到(n-1)),而是从指定的索引(k到(n-1))到其末尾: input_str = 'edayzadr' sorted_str = 'edazyrda' 排序只能在索引(3,7)之间进行。您必须使用切片将排序应用于子部分,然后重新连接部件: return input_str[:3] + ''.join(sorted(input_str[3:7])) + input_str[7:] 因为字符串上的sorted(

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

input_str = 'edayzadr'
sorted_str = 'edazyrda'

排序只能在索引(3,7)之间进行。

您必须使用切片将排序应用于子部分,然后重新连接部件:

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

可以使用切片来引用要排序的子字符串(使用
sorted()
),然后重新组合前缀、已排序的子字符串和后缀

有几种方法可以重新组装,一种是使用
str.format()

另一种方法是使用
join()


你的分类没有多大意义。您从索引3到索引8(而不是索引7)进行了反向排序。请注意,如果您有一个字符串或元组(都是不可变的)而不是一个列表(可变的),那么答案将略有不同,因此请澄清标题。@rsm:我不太确定;只有两个串联
str.format()
解析格式、推动堆栈调用方法、构建新字符串并再次弹出堆栈也需要时间。你必须计时,并不是说其中一个更快。@rsm:这可能是真的,也可能不是真的。老实说,
+
format()
@rsm的意图可能更清楚:串联需要1.02087902276611,
str.format()
需要1.322662115097046,
str.join()
1.1326570510864258,需要对
[3:7]进行100万次的排序迭代
slice.@rsm:重复的连接应该通过构建一个列表并使用
str.join()
,是来替换。但这不是重复的连接,这是一个小的固定数量的连接。在这个范围内,其他的考虑因素也在起作用。@rsm:如果你愿意;无论如何,我已经在答复中提到了这一点。
str = 'edayzadr'
sorted_str = '{}{}{}'.format(str[:3], ''.join(sorted(str[3:7])), str[7:])
sorted_str = ''.join((str[:3], ''.join(sorted(str[3:7])), str[7:]))