Se esiste un indice elenco, fare X


128

Nel mio programma, l'utente inserisce il numero ne quindi inserisce il nnumero di stringhe, che vengono memorizzate in un elenco.

Devo codificare in modo tale che se esiste un certo indice di elenco, quindi eseguire una funzione.

Ciò è reso più complicato dal fatto che ho annidato le dichiarazioni if ​​in merito len(my_list).

Ecco una versione semplificata di quello che ho ora, che non funziona:

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.

1
Sembra che tu voglia digitare cast ncome numero intero, non come un elenco. Non ho capito bene.
mVChr

2
Sì, il vero problema qui è usare ninvece che namsin ifs
Wooble il

Nel tuo caso n non è un elenco. Prima controlla (cast) che sia un numero intero, quindi puoi iterare o enumerare in base all'effetto che vuoi ottenere.
Rilassato il

Sì, mal digitato. Risolto su nams []
user1569317

"il fatto che io abbia delle dichiarazioni sub if su len (my_list)." Hai pensato a cosa è implicito su quali indici di lista esistono, dal fatto che lenla lista ha almeno un certo valore?
Karl Knechtel,

Risposte:


157

Potrebbe essere più utile utilizzare la lunghezza dell'elenco len(n)per informare la tua decisione piuttosto che controllare n[i]ogni possibile lunghezza?


6
Sì. Dopo aver esaminato il codice, il mio set-up era completamente superfluo; len (n) ha realizzato tutto ciò di cui avevo bisogno. Grazie per un punto nella giusta direzione.
user1569317

1
Questo non tiene conto degli indici negativi. Il modo migliore che conosco è provare / tranne IndexError, ma sarebbe bello avere un modo conciso per ottenere un bool
Abram

In Python gli indici negativi sugli elenchi contano solo all'indietro dalla fine dell'elenco. Quindi non potrebbero esistere in modo tale da influire sulla lunghezza dell'elenco.
JonathanV,

84

Devo codificare in modo tale che se esiste un certo indice di elenco, quindi eseguire una funzione.

Questo è l'uso perfetto per un blocco try :

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...

Tuttavia, per definizione, tutti gli elementi in un elenco Python tra 0ed len(the_list)-1esistono (cioè, non è necessario provare, tranne se lo sai 0 <= index < len(the_list)).

È possibile utilizzare enumerare se si desidera che gli indici siano compresi tra 0 e l'ultimo 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...

Se stai cercando un pensiero "indice" definito, penso che stai facendo la domanda sbagliata. Forse dovresti prendere in considerazione l'uso di un contenitore di mappatura (come un dict) rispetto a un contenitore di sequenze (come un elenco). È possibile riscrivere il codice in questo modo:

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)

Funziona così:

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

Puoi anche usare il metodo .get piuttosto che provare / ad eccezione di una versione più breve:

>>> something_to_do.get(3, default)('bob')
some thing 1 done with bob
>>> something_to_do.get(22, default)('alice')
nothing done with alice

3
provare a bloccare? Sono un principiante in Python ma questo sembra un grande no in programmazione ... eccezioni per il controllo del flusso? L'eccezione dovrebbe essere per cose che non possiamo controllare, giusto?
Luis

3
@Luis Sono anche un principiante in Python, ma da quello che ho letto la gestione delle eccezioni in questi casi è lo stile che Python promuove e C / Java / C # no. Vedere stackoverflow.com/questions/11360858/...
Tinister

La frase "tutti gli indici in un elenco Python tra 0 e len (elenco)" è assolutamente sbagliata. Diciamo che c'è una lista x = [1, 2, 3] che len_x = 3. Non esiste un indice come 3. La frase avrebbe dovuto essere: 'tutti gli indici in una lista Python tra 0 e len (lista) - 1' .
Lior Magen,

9
@LiorMagen: hai ragione e l'ho modificato. È un po 'difficile votare un post abbastanza popolare per un errore così pedante. Un semplice commento sarebbe sufficiente.
dawg

Sottolineerò che attaccare le cose all'interno di a trynon ti dice se l'indice esiste solo se è intercettabile - prendi -1- quell'indice non esiste davvero ma verrebbe restituito un valore.
George Mauer,

17

len(nams)dovrebbe essere uguale a nnel tuo codice. Tutti gli indici 0 <= i < n"esistono".


15

Può essere fatto semplicemente usando il seguente codice:

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

6

Devo codificare in modo tale che se esiste un certo indice di elenco, quindi eseguire una funzione.

Sai già come testare questo e infatti stai già eseguendo tali test nel tuo codice .

Gli indici validi per una lista di lunghezza nsono 0attraverso n-1inclusiva.

Pertanto, un elenco ha un indice i se e solo se la lunghezza dell'elenco è almeno i + 1.


Sì, avevo gli strumenti per risolvere il mio problema, ma non li stavo applicando chiaramente. Grazie per un punto nella giusta direzione.
user1569317

Grazie per questo, specialmente l'ultima frase, che è una proprietà importante degli elenchi Python che li rende diversi dagli array JavaScript e da altri costrutti simili.
robert,

6

L'utilizzo della lunghezza dell'elenco sarebbe la soluzione più veloce per verificare l'esistenza di un indice:

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

Questo verifica anche gli indici negativi e la maggior parte dei tipi di sequenza (Like rangese strs) che hanno una lunghezza.

Se in seguito è necessario accedere all'elemento in quell'indice, è più facile chiedere perdono che autorizzazione , ed è anche più veloce e più Pythonic. Usa try: except:.

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

Questo sarebbe al contrario di:

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

3

Se vuoi iterare i dati degli attori inseriti:

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

1

ok, quindi penso che sia effettivamente possibile (per ragioni di argomento):

>>> your_list = [5,6,7]
>>> 2 in zip(*enumerate(your_list))[0]
True
>>> 3 in zip(*enumerate(your_list))[0]
False

anche se questo sarebbe ancora più semplice:3 in range(len(your_list)
circa il

1
o anche questo 3 in xrange(len(your_list)- probabilmente non può fare di meglio
tra il

1

Puoi provare qualcosa del genere

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];

1

Oneliner:

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

Esempio 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

Solo per informazioni Imho, try ... except IndexErrorè la soluzione migliore.


-3

Non lasciare spazio davanti alle parentesi.

Esempio:

n = input ()
         ^

Suggerimento: è necessario aggiungere commenti sopra e / o sotto il codice. Non dietro il tuo codice.


Buona giornata.


Benvenuti in SO! La tua risposta sembra un commento piuttosto che una risposta. Una volta che hai una reputazione sufficiente , sarai in grado di commentare qualsiasi post. Controlla anche questo cosa posso fare invece . Se intendevi rispondere, leggi questo how-to-answer per seguire le linee guida SO.
thewaywewere

-3

Molte risposte, non quella semplice.

Per verificare se esiste un indice "id" nel dizionario dict:

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

if 'age' in dic

ritorna vero se esiste 'età'.


1
Non è una buona risposta alla domanda. La domanda riguardava gli elenchi, non i dizionari. Quello che hai proposto non può essere fatto in casi come questo: ["joao", 39]
Ruhrpottpatriot
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.