2015-09-06 3 views
-1

У меня есть массив/строка/список (длина = n), который нужно сортировать, а не полностью (т.е. не от 0 до (n-1)), а из указанного индекса (к (п-1)) к своему концу:Как сортировать в массиве между указанным индексом

input_str = 'edayzadr' 
sorted_str = 'edazyrda' 

сортировка должна происходить только между индексом (3,7).

+0

Ваш сортировка не имеет особого смысла. Вы отсортировали ** в обратном порядке ** из индексов 3-8, а не 7. –

+0

Обратите внимание, что если у вас есть * string * или * tuple * (оба неизменяемые), а не * список * (изменчивый), ответ будет немного отличаться , поэтому, пожалуйста, уточните название. – jonrsharpe

ответ

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 до индекса (кусочки 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 
+0

@rsm: Я не уверен; всего 2 конкатенации; 'str.format()' также занимает время, чтобы проанализировать формат, нажать стек, чтобы вызвать метод, и построить новую строку и снова поместить стек. Вам нужно будет это время, это не означает, что тот или другой быстрее. –

+0

@rsm: Это может быть или не быть правдой. Честно говоря, намерение, вероятно, более ясное с '+' чем 'format()'. – mhawke

+0

@rsm: concatenation принимает 1.0208790302276611, 'str.format()' принимает 1.322662115097046 и 'str.join()' 1.1326570510864258 за 1 миллион итераций при сортировке '[3: 7]' slice. –

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:])) 
Смежные вопросы