У меня есть список строк, которые уже отсортированы в регистро-независимом порядке. Я хотел бы вставить новую строку в список. Один из способов сделать это, чтобы добавить элемент, а затем отсортировать список, например, так:Вставить элемент в отсортированный по регистру список в Python
myList.append('Something')
myList.sort(key=lambda s: s.lower())
Но мне было интересно, если есть способ просто вставить элемент в правильном положении без повторной сортировки все это ,
Я нашел этот вопрос: Insert an item into a sorted list in Python. Он указывает на модуль bisect Python. Но этот модуль не похож, что он может поддерживать нечувствительность к регистру.
Edit: Я проверял несколько ответов, перечисленных здесь.
- Добавление предмета в конец и сортировка всего списка (как предложено в исходном вопросе) была самой медленной.
- Ответ Moinuddin Quadri был быстрее, чем сортировка всего списка, но он все еще был довольно медленным из-за запуска
lower()
на каждый элемент в списке. - Ответ Стефана Похмана был на порядок быстрее, чем сортировка всего списка.
- Ответ Джареда Гогуена был самым быстрым для повторных вставок. В первый раз, однако, он запускает
lower()
на каждый элемент.
Это был близкий звонок, чтобы принять ответ. В конце концов, я пошел с ответом Стефана Похмана, потому что он был лучшим для одноразовой вставки, и доступ к результирующему списку не требует доступа к переменной-члену. Однако варианты использования различаются, поэтому обязательно изучите все ответы.
Поскольку * нечувствительны к регистру * отсортированный список. Разрешено ли преобразовывать все строки в строки с нижним окошком? –
Вот рецепт класса, который обертывает 'bisect' и поддерживает ключевые функции (например,' str.lower'): https://code.activestate.com/recipes/577197-sortedcollection/ –
Вы можете просто скопировать и вставить 'bisect. insort' (это всего лишь несколько строк) и применить '.lower()' к обеим сторонам сравнения '<'. –