Se o índice da lista existir, faça X


128

No meu programa, o usuário digita o número ne, em seguida, o nnúmero de seqüências de caracteres, que são armazenadas em uma lista.

Preciso codificar para que, se um determinado índice de lista existir, execute uma função.

Isso se torna mais complicado pelo fato de eu ter aninhado declarações if len(my_list).

Aqui está uma versão simplificada do que tenho agora, que não está funcionando:

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
Parece que você deseja digitar cast ncomo um número inteiro, não como uma lista. Estou confuso.
MVChr

2
Sim, o problema real aqui está usando n, em vez de namsnos ifs
Wooble

No seu caso, n não é uma lista. Primeiro, verifique (converter) para ser um número inteiro e, em seguida, você poderá iterar ou enumerar, dependendo do efeito que deseja obter.
Laidback

Sim, digitado errado. Corrigido para nams []
user1569317

"o fato de eu ter declarações sub if sobre len (my_list)." Você já pensou no que está implícito sobre quais índices da lista existem, pelo fato de que lena lista é pelo menos um determinado valor?
194 Karl Knechtel

Respostas:


157

Poderia ser mais útil você usar o comprimento da lista len(n)para informar sua decisão, em vez de verificar n[i]cada comprimento possível?


6
Sim. Ao revisar o código, minha configuração foi completamente supérflua; len (n) realizou tudo o que eu precisava. Obrigado por um ponto na direção certa.
User1569317

1
Isso não leva em conta índices negativos. A melhor maneira que eu sei é try / exceto IndexError, mas seria bom ter uma maneira concisa para obter um bool
Abram

No Python, os índices negativos nas listas são contabilizados de trás para frente no final da lista. Portanto, eles não poderiam existir de uma maneira que impactasse o comprimento da lista.
JonathanV

84

Preciso codificar para que, se um determinado índice de lista existir, execute uma função.

Este é o uso perfeito para um bloco 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...

No entanto, por definição, todos os itens em uma lista Python entre 0e len(the_list)-1existem (ou seja, não há necessidade de uma tentativa, exceto se você souber 0 <= index < len(the_list)).

Você pode usar enumerar se desejar os índices entre 0 e o ú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...

Se você está procurando algum pensamento definido de "índice", acho que está fazendo a pergunta errada. Talvez você deva considerar o uso de um contêiner de mapeamento (como um dict) versus um contêiner de sequência (como uma lista). Você pode reescrever seu código assim:

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)

Executa assim:

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

Você também pode usar o método .get em vez de tentar / exceto para uma versão mais curta:

>>> 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
tente bloquear? Eu sou um iniciante em Python, mas isso parece um grande não, não na programação ... exceções para controle de fluxo? A exceção deve ser para coisas que não podemos controlar, certo?
Luis

3
@ Luis Eu também sou iniciante em Python, mas pelo que li sobre manipulação de exceções nessas instâncias é o estilo que o Python promove que C / Java / C # não. Veja stackoverflow.com/questions/11360858/…
Tinister

A frase 'todos os índices em uma lista Python entre 0 e len (lista)' está absolutamente errada. Digamos que exista uma lista x = [1, 2, 3] que len_x = 3. Não existe um índice como 3. A sentença deveria ter sido: 'todos os índices em uma lista Python entre 0 e len (lista) - 1' .
Lior Magen #

9
@LiorMagen: Você está certo e eu editei. Isso é meio difícil de votar em um post bastante popular por um erro tão pedante. Um simples comentário seria suficiente.
Dawg

Eu vou salientar que furar as coisas dentro de um trynão não dizer se existe o índice apenas se for fetchable - take -1- que o índice realmente não existe , mas um valor seria devolvido.
George Mauer

17

len(nams)deve ser igual ao nseu código. Todos os índices 0 <= i < n"existem".


15

Isso pode ser feito simplesmente usando o seguinte código:

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

6

Preciso codificar para que, se um determinado índice de lista existir, execute uma função.

Você já sabe como testar isso e, de fato, já está realizando esses testes no seu código .

Os índices válidos para uma lista de comprimento nsão 0atravésn-1 inclusiva.

Assim, uma lista possui um índice i se, e somente se, o comprimento da lista for pelo menos i + 1.


Sim, eu tinha as ferramentas para resolver meu problema, mas não as estava aplicando claramente. Obrigado por um ponto na direção certa.
User1569317

Obrigado por isso, especialmente a última frase, que é uma propriedade importante das listas Python que as tornam diferentes das matrizes JavaScript e outras construções semelhantes.
robert

6

Usar o comprimento da lista seria a solução mais rápida para verificar se existe um índice:

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

Isso também testa índices negativos e a maioria dos tipos de sequência (como rangesestr s) que têm um comprimento.

Se você precisar acessar o item nesse índice posteriormente, é mais fácil pedir perdão do que permissão , e também é mais rápido e mais Pythonic. Use try: except:.

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

Isso seria o contrário de:

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

3

Se você deseja iterar os dados dos atores inseridos:

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

1

ok, então eu acho que é realmente possível (por uma questão de argumento):

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

embora isso fosse ainda mais simples:3 in range(len(your_list)
avloss 02/02

1
ou até mesmo este 3 in xrange(len(your_list)- provavelmente não pode fazer melhor do que este
avloss

1

Você pode tentar algo assim

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()  

Exemplo 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

Apenas para informação. Imho, try ... except IndexErroré a melhor solução.


-3

Não deixe espaço na frente dos seus suportes.

Exemplo:

n = input ()
         ^

Dica: você deve adicionar comentários acima e / ou abaixo do seu código. Não está por trás do seu código.


Tenha um bom dia.


Bem-vindo ao SO! Sua resposta parece mais um comentário do que uma resposta. Depois de ter reputação suficiente, você poderá comentar qualquer postagem. Verifique também o que posso fazer . Se você pretende Resposta, leia este how-to-resposta de seguir as orientações assim.
thewaywewere

-3

Muitas respostas, não a simples.

Para verificar se um índice 'id' existe no dicionário dict:

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

if 'age' in dic

retorna true se 'idade' existir.


1
Não é uma boa resposta para a pergunta. A questão era sobre listas, não dicionários. O que você propôs não pode ser feito em casos como este: ["joao", 39]
Ruhrpottpatriot
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.