it-swarm-pt.tech

Elemento de verificação existe no array

Em PHP existe uma função chamada isset() para verificar se algo (como um índice de array) existe e possui um valor. Como sobre o Python?

Eu preciso usar isso em matrizes porque eu recebo "IndexError: índice de lista fora do intervalo" às vezes.

Eu acho que eu poderia usar try/catching, mas isso é um último recurso.

57
Jonny

Olhe antes de pular ( LBYL ):

if idx < len(array):
    array[idx]
else:
    # handle this

Mais fácil pedir perdão do que permissão ( EAFP ):

try:
    array[idx]
except IndexError:
    # handle this

Em Python, o EAFP parece ser o estilo popular e preferido (porque geralmente é mais confiável). Então, se todas as outras coisas forem iguais, recomendo ir para a versão try/except neste caso de uso - não a vejo como um "último recurso".

Este trecho é dos documentos oficiais vinculados acima, endossando usando try/exceto para controle de fluxo:

Esse estilo de codificação comum Python assume a existência de chaves ou atributos válidos e captura exceções se a suposição for falsa. Esse estilo limpo e rápido é caracterizado pela presença de muitos comandos try e except .

95
wim

EAFP vs. LBYL

Eu entendo seu dilema, mas Python não é PHP e estilo de codificação conhecido como Mais fácil pedir perdão do que por permissão (ou EAFP em suma) é um estilo de codificação comum em Python .

Veja a fonte (de documentação ):

EAFP - É mais fácil pedir perdão do que permissão. Esse estilo de codificação comum Python assume a existência de chaves ou atributos válidos e captura exceções se a suposição for falsa. Este estilo limpo e rápido é caracterizado pela presença de muitos comandos try e except. A técnica contrasta com o estilo LBYL comum a muitas outras linguagens, como C.

Então, basicamente, usar instruções try-catch aqui não é um último recurso; é uma prática comum .

"Matrizes" em Python

PHP possui matrizes associativas e não-associativas, Python possui listas, tuplas e dicionários. As listas são semelhantes às matrizes não-associativas PHP, os dicionários são similares aos arrays associativos PHP.

Se você quer checar se "chave" existe em "array", você deve primeiro dizer que tipo em Python é, porque eles lançam erros diferentes quando a "chave" não está presente:

>>> l = [1,2,3]
>>> l[4]

Traceback (most recent call last):
  File "<pyshell#2>", line 1, in <module>
    l[4]
IndexError: list index out of range
>>> d = {0: '1', 1: '2', 2: '3'}
>>> d[4]

Traceback (most recent call last):
  File "<pyshell#6>", line 1, in <module>
    d[4]
KeyError: 4

E se você usar o estilo de codificação EAFP, você deve capturar esses erros apropriadamente.

Estilo de codificação LBYL - verificando a existência de índices

Se você insistir em usar a abordagem LBYL, estas são soluções para você:

  • para listas apenas verifique o comprimento e se possible_index < len(your_list), então your_list[possible_index] existe, caso contrário não:

    >>> your_list = [0, 1, 2, 3]
    >>> 1 < len(your_list) # index exist
    True
    >>> 4 < len(your_list) # index does not exist
    False
    
  • para dicionários você pode usar a palavra-chave in e se possible_index in your_dict, então your_dict[possible_index] existe, caso contrário não:

    >>> your_dict = {0: 0, 1: 1, 2: 2, 3: 3}
    >>> 1 in your_dict # index exists
    True
    >>> 4 in your_dict # index does not exist
    False
    

Isso ajudou?

43
Tadeck
`e` in ['a', 'b', 'c']  # evaluates as False
`b` in ['a', 'b', 'c']  # evaluates as True

EDIT: Com o esclarecimento, nova resposta:

Note que os arrays PHP são muito diferentes dos do Python, combinando arrays e dicts em uma estrutura confusa. Matrizes Python sempre têm índices de 0 para len(arr) - 1, para que você possa verificar se seu índice está nesse intervalo. try/catch é uma boa maneira de fazer isso pythonically, no entanto.

Se você está perguntando sobre a funcionalidade de hash de arrays PHP "(dict do Python), então minha resposta anterior ainda é:

`baz` in {'foo': 17, 'bar': 19}  # evaluates as False
`foo` in {'foo': 17, 'bar': 19}  # evaluates as True
15
Amadan

has_key é rápido e eficiente.

Em vez de matriz, use um hash:

valueTo1={"a","b","c"}

if valueTo1.has_key("a"):
        print "Found key in dictionary"
7
Arik Harel

Você pode usar a função interna dir() para produzir um comportamento similar ao isset() do PHP, algo como:

if 'foo' in dir():  # returns False, foo is not defined yet.
    pass

foo = 'b'

if 'foo' in dir():  # returns True, foo is now defined and in scope.
   pass

dir() retorna uma lista dos nomes no escopo atual, mais informações podem ser encontradas aqui: http://docs.python.org/library/functions.html#dir .

0
DRH