2010-03-09 14 views
10

Sé lo que estoy buscando. Quiero pitón que me diga qué lista es enPython: lista de indización para el elemento en la lista anidada

aquí hay algo de pseudocódigo:.

item = "a" 

nested_list = [["a", "b"], ["c", "d"]] 

list.index(item) #obviously this doesn't work 

aquí me gustaría pitón para volver 0 (porque "a" es un elemento en el primer sub-lista en el lista más grande). No me importa qué subelemento es. No me importa si hay duplicados, por ejemplo, ["a", "b", "a"] debería devolver lo mismo que el ejemplo anterior.

Respuesta

1

Tendrá que utilizar una estructura iterativa de algún tipo:

next((sublist for sublist in mainlist if item in sublist)) 

que le dará un generador para todas las sub-listas que contienen el elemento que desea, y le dará la primera.

+1

Sí: esto da la lista secundaria, mientras que la OP especifica que quieren que el índice del sub-lista, como vuelva en mi respuesta. –

12

En Python 2,6 o mejor,

next((i for i, sublist in enumerate(nested_list) if "a" in sublist), -1) 

suponiendo por ejemplo, desea un resultado -1 si 'a' no está presente en ninguna de las sublistas.

Por supuesto que también se puede hacer en versiones anteriores de Python, pero no del todo bien, y ya que no especifica qué versiones de Python le interesan, creo que es mejor usar la última versión de producción uno sólido (simplemente edite su respuesta si necesita especificar otras versiones anteriores de Python).

Editar: por solicitud, permítanme explicar cómo funciona esto. Estoy usando la función incorporada (nueva en 2.6) next, específicamente estoy llamando al next(iterator, default): devuelve el siguiente elemento del iterador (y por lo tanto el primero, ya que esta es la primera vez que avanzamos ese iterador), o el valor predeterminado si el iterador está terminado (lo que significa "vacío" si está terminado antes de que lo avancemos ;-). El valor predeterminado es claramente -1 y se devuelve si "a no está presente en ninguna de las sublistas", lo que significa lo mismo que "el iterador está vacío" en este caso. mirada

Vamos en el iterador nuevo:

(i for i, sublist in enumerate(nested_list) if "a" in sublist) 

los paréntesis (redondeado) y for y if palabras clave significa que este es un generador de expresión, también conocido por brevedad genexp. i (el índice) y sublist (el ítem en ese índice) avanza más de enumerate(nested_list) - si no tuviéramos enumerate aquí, entonces no estaríamos haciendo un seguimiento del índice, pero en este caso lo necesitamos. Solo se tienen en cuenta cuando se cumple la cláusula if, es decir, cuando el elemento que está buscando está presente en la sublista actual.

Así que este genexp produce, uno por vez, cada valor del índice de manera que la sublista en ese índice cumpla la condición "a" in sublist. Dado que lo estamos utilizando dentro de next, solo tomamos el primer índice.

El OP podría estar justificado por pensar que un comando mágico haciendo todo esto en tres o cuatro caracteres sería más útil, y así lo haría, para este requisito tan específico, que creo que nunca he visto antes en más de diez años de uso de Python; Sin embargo, si cada uno de esos requisitos específicos tuviese su propia estructura interna especializada, el idioma y los edificios adquiridos serían mayores que el código tributario.En cambio, Python ofrece muchos "bloques de lego" de bajo nivel y algunas formas prácticas de juntarlos, para expresar de forma clara (y razonablemente concisa) la solución a una gran variedad combinatoria de requisitos específicos, como los OP.

+1

Dado que es nuevo en la programación, ¿sería tan amable de explicar cómo funciona esto? :) Sin embargo, tienes mi +1 de todos modos. –

+0

@musicfreak, claro, déjame agregar alguna explicación. –

+0

¡Guau, gran explicación! ¡Te daría más votos si pudiera! –

0

Itere sobre la lista para obtener cada sublista. A continuación, comprobar para ver si el artículo está en la lista secundaria:

for i in range(0,len(list)): 
    if whatYoureLookingFor in list[i]: 
     print i 
0
>>> nested_list = [["a", "b"], ["c", "d"]] 
>>> item="a" 
>>> for o,sublist in enumerate(nested_list): 
...  if item in sublist: 
...   print o 
... 
0 
Cuestiones relacionadas