Estou procurando um equivalente em python de dictionary.get(key, default)
para listas. Existe algum idioma de liner para obter o enésimo elemento de uma lista ou um valor padrão, se não estiver disponível?
Por exemplo, dada uma lista myList que eu gostaria de obter myList[0]
, ou 5 se myList
for uma lista vazia.
Obrigado.
index == -1000000
deve retornardefault
.x[index] if 0 <= index < len(x) else default
seria melhor seindex
pudesse ser negativo.valid_index()
está incorreta. Índices negativos são legais em Python - deveria ser-len(l) <= index < len(l)
.Edit: Eu removi a verificação para TypeError - provavelmente melhor deixar o chamador lidar com isso.
fonte
Provavelmente é melhor à medida que
a
aumentaIsso funciona porque if
a[n:]
é uma lista vazia sen => len(a)
Aqui está um exemplo de como isso funciona com
range(5)
E a expressão completa
fonte
next(iter(lst[i:i+1]), default)
- apenas mais uma entrada na competição de uma linha feia e enigmática.Acabei de descobrir que:
iter(l)
retorna um iteradormyList
,next()
consome o primeiro elemento do iterador e gera umStopIteration
erro, exceto se chamado com um valor padrão, que é o caso aqui, o segundo argumento,5
Isso só funciona quando você deseja o primeiro elemento, como é o caso no seu exemplo, mas não no texto da sua pergunta, então ...
Além disso, ele não precisa criar listas temporárias na memória e funciona para qualquer tipo de iterável, mesmo que não tenha um nome (consulte o comentário de Xiong Chiamiov na resposta de gruszczy)
fonte
next(iter(myList[n:n+1]), 5)
Agora ele funciona para on
elemento th.try
variante não é uma linha (peça solicitada pelo OP). Funciona apenas para listas porquemyList
é uma lista especificada pelo OP (para ser mais preciso, é algo indexável). Criar uma cópia na memória não é caro aqui, porque estou criando uma lista de um único elemento (ou nenhum) aqui. Claro, um pouco acima, mas não vale a pena mencionar, a menos que você faça isso milhões de vezes seguidas. Btw, eu acho que criar e capturar umaIndexError
exceção é provavelmente mais caro.fonte
[] or ...
fez. No entanto, eu pessoalmente usaria apenas a solução aceita, pois ela lê facilmente (para iniciantes). Concedido, envolvê-lo em um 'def' com comentários tornaria isso amplamente um problema.L[n] == False
ouL[n] == None
ouL[n] == []
ou mais globalmente qualquer coisa que avalia a falsa?[False]
é verdadeira.myval = l[n:n+1] or [somedefault]
iria funcionar muito bem?Existem receitas de ferramentas que fazem isso para iteráveis gerais. Por conveniência, você pode
> pip install more_itertools
importar esta biblioteca de terceiros que implementa essas receitas para você:Código
Detalhe
Aqui está a implementação da
nth
receita:Assim
dict.get()
, essa ferramenta retorna um padrão para os índices ausentes. Aplica-se a iterables gerais:fonte
Uma solução barata é realmente fazer um ditado com enumerar e usar
.get()
como de costume, comofonte
Combinando o @ Joachim's com o acima, você pode usar
Exemplos:
Ou, talvez mais claro, mas sem o
len
fonte
Usando o Python 3.4
contextlib.suppress(exceptions)
para criar umgetitem()
método semelhante aogetattr()
.fonte