Python: Почему у списков нет метода поиска? - PullRequest
8 голосов
/ 03 октября 2010

Я пытался написать ответ на этот вопрос и был очень удивлен, обнаружив, что для списков нет метода поиска, у списков есть только метод индекса (в строках есть поиск и индекс).

Может кто-нибудь сказать мне обоснование этого?Почему у строк есть и то и другое?

Ответы [ 3 ]

7 голосов
/ 03 октября 2010

Я не знаю, почему или, может быть, где-то похоронен в каком-то PEP, но я знаю 2 очень простых метода "поиска" для списков, и они array.index() и оператор inВы всегда можете использовать эти 2, чтобы найти свои предметы.(Также модуль re и т. Д.)

3 голосов
/ 01 сентября 2012

Я думаю, что причина отсутствия отдельных методов 'find' и 'index' в том, что они недостаточно различны. Оба вернут одно и то же в случае, если искомый элемент существует в списке (это верно для двух строковых методов); они отличаются в случае, если искомого элемента нет в списке / строке; однако вы можете тривиально построить любой из find / index из другого. Если вы работаете с другими языками, может показаться плохим манер поднимать и отлавливать исключения для условия без ошибок, которое вы могли бы легко проверить, но в Python часто считается более питоническим стрелять первым и задавать вопросы позже. , использовать обработку исключений вместо тестов, подобных этому (пример: Лучше «попробовать» что-то и поймать исключение или проверить, если это возможно, сначала, чтобы избежать исключения? ).

Я не думаю, что это хорошая идея для построения 'find' из 'index' и 'in', например

if foo in my_list:
   foo_index = my_list.index(foo)
else:
    foo_index = -1 # or do whatever else you want

потому что и in, и index потребуют пропустить O (n) по списку.

Лучше построить 'find' из 'index' и try / catch, например:

try:
    foo_index = my_list.index(foo)
catch ValueError:
    foo_index = -1 # or do whatever else you want

Теперь о том, почему список был построен таким образом (только с индексом), а строка была создана другим способом (с отдельным индексом и находкой) ... Я не могу сказать.

2 голосов
/ 03 октября 2010

Метод "find" для списков: index.

Я считаю несоответствие между string.find и list.index неудачным, как по имени, так и по поведению: string.find возвращает -1когда совпадений не найдено, где list.index вызывает ValueError.Это могло бы быть разработано более последовательно.Единственное непримиримое различие между этими операциями заключается в том, что string.find ищет строку элементов, где list.index ищет ровно один элемент (что само по себе не оправдывает использование разных имен).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...