Si existe un índice de lista, haga X

128

En mi programa, el usuario ingresa el número ny luego ingresa el nnúmero de cadenas, que se almacenan en una lista.

Necesito codificar de modo que si existe un cierto índice de lista, ejecute una función.

Esto se hace más complicado por el hecho de que he anidado las declaraciones if sobre len(my_list).

Aquí hay una versión simplificada de lo que tengo ahora, que no funciona:

n = input ("Define number of actors: ")

count = 0

nams = []

while count < n:
    count = count + 1
    print "Define name for actor ", count, ":"
    name = raw_input ()
    nams.append(name)

if nams[2]: #I am trying to say 'if nams[2] exists, do something depending on len(nams)
    if len(nams) > 3:
        do_something
    if len(nams) > 4
        do_something_else

if nams[3]: #etc.
usuario1569317
fuente
1
Parece que desea escribir cast ncomo un entero, no como una lista. Estoy confundido.
mVChr
2
Sí, el verdadero problema aquí es usar en nlugar de namsen el ifs
Wooble
En su caso, n no es una lista. Primero verifique (emitir) para que sea un número entero, luego puede iterar o enumerar según el efecto que desee lograr.
relajado
Sí, mal escrito. Solucionado en nams []
user1569317
"el hecho de que tengo declaraciones sub if sobre len (my_list)". ¿Ha pensado qué implican los índices de la lista por el hecho de que el lende la lista tiene al menos un cierto valor?
Karl Knechtel

Respuestas:

157

¿Podría ser más útil para usted usar la longitud de la lista len(n)para informar su decisión en lugar de verificar n[i]cada longitud posible?

JonathanV
fuente
66
Sí. Al revisar el código, mi configuración fue completamente superflua; Len (n) logró todo lo que necesitaba. Gracias por un punto en la dirección correcta.
user1569317
1
Esto no tiene en cuenta los índices negativos. La mejor manera que conozco es probar / excepto IndexError, pero sería bueno tener una forma concisa de obtener un bool
Abram
En Python, los índices negativos en las listas solo cuentan hacia atrás desde el final de la lista. Por lo tanto, no podrían existir de una manera que afecte la longitud de la lista.
JonathanV
84

Necesito codificar de modo que si existe un cierto índice de lista, ejecute una función.

Este es el uso perfecto para un bloque de prueba :

ar=[1,2,3]

try:
    t=ar[5]
except IndexError:
    print('sorry, no 5')   

# Note: this only is a valid test in this context 
# with absolute (ie, positive) index
# a relative index is only showing you that a value can be returned
# from that relative index from the end of the list...

Sin embargo, por definición, todos los elementos en una lista de Python existen 0y len(the_list)-1existen (es decir, no hay necesidad de intentarlo, excepto si lo sabe 0 <= index < len(the_list)).

Puede usar enumerate si desea los índices entre 0 y el último elemento:

names=['barney','fred','dino']

for i, name in enumerate(names):
    print(i + ' ' + name)
    if i in (3,4):
        # do your thing with the index 'i' or value 'name' for each item...

Si está buscando un pensamiento definido de 'índice', creo que está haciendo la pregunta incorrecta. Quizás debería considerar usar un contenedor de mapeo (como un dict) versus un contenedor de secuencia (como una lista). Podrías reescribir tu código así:

def do_something(name):
    print('some thing 1 done with ' + name)

def do_something_else(name):
    print('something 2 done with ' + name)        

def default(name):
    print('nothing done with ' + name)     

something_to_do={  
    3: do_something,        
    4: do_something_else
    }        

n = input ("Define number of actors: ")
count = 0
names = []

for count in range(n):
    print("Define name for actor {}:".format(count+1))
    name = raw_input ()
    names.append(name)

for name in names:
    try:
        something_to_do[len(name)](name)
    except KeyError:
        default(name)

Corre así:

Define number of actors: 3
Define name for actor 1: bob
Define name for actor 2: tony
Define name for actor 3: alice
some thing 1 done with bob
something 2 done with tony
nothing done with alice

También puede usar el método .get en lugar de probar / excepto para una versión más corta:

>>> something_to_do.get(3, default)('bob')
some thing 1 done with bob
>>> something_to_do.get(22, default)('alice')
nothing done with alice
perro
fuente
3
intente bloquear? Soy un principiante en Python pero esto parece un gran no no en programación ... ¿excepciones para el control de flujo? La excepción debería ser para cosas que no podemos controlar, ¿verdad?
Luis
3
@Luis También soy un principiante en Python, pero por lo que he leído, el manejo de excepciones en estos casos es el estilo que Python promueve que C / Java / C # no. Ver stackoverflow.com/questions/11360858/…
Tinister el
La oración 'todos los índices en una lista de Python entre 0 y len (lista)' es absolutamente incorrecta. Digamos que hay una lista x = [1, 2, 3] que len_x = 3. No existe un índice como 3. La oración debería haber sido: 'todos los índices en una lista de Python entre 0 y len (lista) - 1' .
Lior Magen
9
@LiorMagen: Tienes razón y lo edité. Eso es un poco duro para rechazar votar una publicación bastante popular por un error tan pedante. Un simple comentario sería suficiente.
dawg
Señalaré que pegar cosas dentro de un tryno te dice si el índice existe solo si es recuperable, toma -1, ese índice realmente no existe pero se devolvería un valor.
George Mauer
17

len(nams)debe ser igual a nen su código. Todos los índices 0 <= i < n"existen".

jfs
fuente
15

Se puede hacer simplemente usando el siguiente código:

if index < len(my_list):
    print(index, 'exists in the list')
else:
    print(index, "doesn't exist in the list")
usuario6039980
fuente
6

Necesito codificar de modo que si existe un cierto índice de lista, ejecute una función.

Ya sabe cómo probar esto y, de hecho , ya está realizando tales pruebas en su código .

Los índices válidos para una lista de longitud nson 0a través n-1inclusiva.

Por lo tanto, una lista tiene un índice i si y solo si la longitud de la lista es al menos i + 1.

Karl Knechtel
fuente
Sí, tenía las herramientas para resolver mi problema, simplemente no las estaba aplicando claramente. Gracias por un punto en la dirección correcta.
user1569317
Gracias por esto, especialmente la última oración, que es una propiedad importante de las listas de Python que las hace diferentes de las matrices de JavaScript y otras construcciones similares.
robert
6

Usar la longitud de la lista sería la solución más rápida para verificar si existe un índice:

def index_exists(ls, i):
    return (0 <= i < len(ls)) or (-len(ls) <= i < 0)

Esto también prueba los índices negativos y la mayoría de los tipos de secuencia (Me gusta rangesy strs) que tienen una longitud.

Si necesita acceder al elemento en ese índice después de todos modos, es más fácil pedir perdón que permiso , y también es más rápido y más pitónico. Uso try: except:.

try:
    item = ls[i]
    # Do something with item
except IndexError:
    # Do something without the item

Esto sería opuesto a:

if index_exists(ls, i):
    item = ls[i]
    # Do something with item
else:
    # Do something without the item
Artyer
fuente
3

Si desea iterar los datos de actores insertados:

for i in range(n):
    if len(nams[i]) > 3:
        do_something
    if len(nams[i]) > 4:
        do_something_else
gepatino
fuente
1

ok, entonces creo que es realmente posible (en aras de la discusión):

>>> your_list = [5,6,7]
>>> 2 in zip(*enumerate(your_list))[0]
True
>>> 3 in zip(*enumerate(your_list))[0]
False
avloss
fuente
aunque esto sería aún más simple:3 in range(len(your_list)
avloss
1
o incluso esto 3 in xrange(len(your_list)- probablemente no puede ser mejor que esto
avloss
1

Puedes probar algo como esto

list = ["a", "b", "C", "d", "e", "f", "r"]

for i in range(0, len(list), 2):
    print list[i]
    if len(list) % 2 == 1 and  i == len(list)-1:
        break
    print list[i+1];
Suresh Kumar
fuente
1

Un trazador de líneas:

do_X() if len(your_list) > your_index else do_something_else()  

Ejemplo completo:

In [10]: def do_X(): 
    ...:     print(1) 
    ...:                                                                                                                                                                                                                                      

In [11]: def do_something_else(): 
    ...:     print(2) 
    ...:                                                                                                                                                                                                                                      

In [12]: your_index = 2                                                                                                                                                                                                                       

In [13]: your_list = [1,2,3]                                                                                                                                                                                                                  

In [14]: do_X() if len(your_list) > your_index else do_something_else()                                                                                                                                                                      
1

Sólo por información. En mi humilde opinión, try ... except IndexErrores la mejor solución.

Eduard Golubov
fuente
-3

No deje espacio delante de sus soportes.

Ejemplo:

n = input ()
         ^

Consejo: debe agregar comentarios encima y / o debajo de su código. No detrás de tu código.


Que tengas un buen día.

Señor robot
fuente
Bienvenido a SO! Su respuesta parece un comentario en lugar de una respuesta. Una vez que tengas suficiente reputación podrás comentar cualquier publicación. También verifique esto, ¿qué puedo hacer en su lugar ? Si tenía la intención de responder, lea este tutorial para seguir las pautas de SO.
2017
-3

Muchas respuestas, no la simple.

Para verificar si existe un índice 'id' en el diccionario dict:

dic = {}
dic['name'] = "joao"
dic['age']  = "39"

if 'age' in dic

devuelve verdadero si existe 'edad'.

Marco
fuente
1
No es una buena respuesta a la pregunta. La pregunta era sobre listas, no diccionarios. Lo que propusiste no se puede hacer en casos como este: ["joao", 39]
Ruhrpottpatriot