2010-10-03 7 views
8

Estaba intentando escribir una respuesta a este question y me sorprendió bastante descubrir que no hay un método de búsqueda para las listas, las listas solo tienen el método de índice (las cadenas tienen búsqueda e índice).Python: ¿Por qué las listas no tienen un método de búsqueda?

¿Alguien puede decirme la razón detrás de eso? ¿Por qué las cadenas tienen ambos?

+0

Esta pregunta es sobre la lista equivalente de esto: '" 112131 ".find (" 1213 ") => 1' es decir' [1,1,2,1,3,1] .find ([1,2 , 1,3]) => 1' - Si quieres hacer esto * en tiempo lineal *, necesitas implementar uno de los algoritmos de coincidencia de cadenas tú mismo, lo cual no es tan fácil. –

Respuesta

7

No sé por qué o tal vez está enterrado en algún PEP en alguna parte, pero sé 2 métodos muy básicos de "búsqueda" para las listas, y son array.index() y el operador in. Siempre puede usar estos 2 para encontrar sus artículos. (Además, módulo re, etc.)

+2

El método 'index' y el operador' in' pueden buscar elementos individuales en las listas (Alguien dígame si puedo llamarlos atómicos). OP quiere saber si puede encontrar si una lista es una sublista de otra con elementos que aparecen en el mismo orden. – dheerosaur

+0

Pero el principio básico detrás también es la iteración a través de la lista, ya sea anidada o no, y encontrarlos con estos operadores. OP también es libre de desarrollar su propio método/clases/generadores, etc. para eso. – ghostdog74

+0

El método estándar de 'buscar' para matrices es buscar un solo elemento. Nadie se sorprendería al saber que una implementación de matriz no hace búsquedas de subcadenas. –

2

El método "buscar" para las listas es index.

me hacen considerar la inconsistencia entre string.find y list.index sea lamentable, tanto en nombre y comportamiento: string.find devuelve -1 cuando no se encuentra ninguna coincidencia, donde list.index plantea ValueError. Esto podría haber sido diseñado de manera más consistente. La única diferencia irreconciliable entre estas operaciones es que string.find busca una cadena de elementos, donde list.index busca exactamente un elemento (que, por sí solo, no justifica el uso de nombres diferentes).

+2

intente '" asdfasdf ".index ('z')' la próxima vez que esté en REPL. – aaronasterling

+0

@ AaronMcSmooth: resalta lo absurdo de la "forma obvia de hacer algo", a menudo repetida, cuando ni siquiera pueden retenerla para los métodos de cadena principal. –

+2

pero el punto de mi ejemplo es que _do_ se aferran a él. 'list' y' string' tienen un método 'index' que se comporta exactamente igual. es solo que 'string' agrega un método' find' además de eso. No estoy seguro de por qué no lo hacen para 'list' también, pero no hay equivalencia entre' list.index' y 'string.find'. – aaronasterling

3

Creo que la razón para no tener métodos separados de 'buscar' e 'indexar' es que no son lo suficientemente diferentes. Ambos devolverían lo mismo en el caso de que el elemento buscado exista en la lista (esto es cierto para los dos métodos de cadena); difieren en caso de que el elemento buscado no esté en la lista/cadena; sin embargo, puede construir trivialmente cualquiera de los dos: find/index. Si vienes de otros idiomas, puede parecer de mala educación plantear y detectar excepciones para una condición sin errores que podrías probar fácilmente, pero en Python, a menudo se considera más pitónico disparar primero y hacer preguntas más tarde, er , para usar el manejo de excepciones en lugar de pruebas como esta (ejemplo: Better to 'try' something and catch the exception or test if its possible first to avoid an exception?).

No creo que sea una buena idea para construir 'hallazgo' de 'índice' y 'en', como

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

porque tanto dentro como índice requerirá un O pasar (n) a lo largo la lista.

mejor construir 'hallazgo' de 'índice' y tratar/catch, como:

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

Ahora, en cuanto a porqué la lista fue construido de esta manera (con un índice solamente), y la cadena se construyó el de otra manera (con índice separado y encontrar) ... No puedo decir.

Cuestiones relacionadas