Eu amo usar a expressão
if 'MICHAEL89' in USERNAMES:
...
onde USERNAMES
está uma lista
Existe alguma maneira de corresponder itens com distinção entre maiúsculas e minúsculas ou preciso usar um método personalizado? Basta saber se é necessário escrever um código extra para isso.
python
string
list
case-insensitive
RadiantHex
fonte
fonte
if 'CaseFudge'.lower() in [x.lower() for x in list]
[...]
cria a lista inteira.(name.upper() for name in USERNAMES)
criaria apenas um gerador e uma string necessária de cada vez - economia de memória massiva se você estiver fazendo muito esta operação. (poupança ainda mais, se você simplesmente criar uma lista de nomes de usuários minúsculas que você reutilizar para a verificação de cada vez)Eu faria um invólucro para que você não seja invasivo. Minimamente, por exemplo ...:
Agora,
if CaseInsensitively('MICHAEL89') in whatever:
deve se comportar conforme necessário (se o lado direito é uma lista, ditado ou conjunto). (Pode ser necessário mais esforço para obter resultados semelhantes para a inclusão de strings, evitar avisos em alguns casos envolvendounicode
etc.).fonte
CaseInsensitively('MICHAEL89') in {CaseInsensitively('Michael89'):True}
que isso funcionasse, o que provavelmente não se enquadra em "se comporta conforme necessário".etc.
e partes "exigem mais esforço" da minha resposta ;-).Normalmente (pelo menos no topo), você molda seu objeto para se comportar da maneira que deseja.
name in USERNAMES
não faz distinção entre maiúsculas e minúsculas, por issoUSERNAMES
precisa mudar:O melhor disso é que ele abre o caminho para muitas melhorias, sem precisar alterar nenhum código fora da classe. Por exemplo, você pode alterar
self.names
para um conjunto para pesquisas mais rápidas ou calcular a(n.lower() for n in self.names)
única vez e armazená-lo na classe e assim por diante ...fonte
str.casefold
é recomendado para correspondência de cadeia que não diferencia maiúsculas de minúsculas. A solução do @ nmichaels pode ser trivialmente adaptada.Use:
Ou:
Conforme os documentos :
fonte
Aqui está uma maneira:
Para que isso funcione, os objetos
string1
estring2
devem ser do tipostring
.fonte
Eu acho que você precisa escrever um código extra. Por exemplo:
Nesse caso, estamos formando uma nova lista com todas as entradas em
USERNAMES
convertidas para maiúsculas e comparando com essa nova lista.Atualizar
Como o @viraptor diz, é ainda melhor usar um gerador em vez de
map
. Veja a resposta da @Nathon .fonte
itertools
funçãoimap
. É muito mais rápido que um gerador, mas cumpre o mesmo objetivo.Você poderia fazer
Atualização: joguei um pouco e estou pensando que você poderia obter uma melhor abordagem do tipo de curto-circuito usando
A
ifilter
função é do itertools, um dos meus módulos favoritos no Python. É mais rápido que um gerador, mas apenas cria o próximo item da lista quando chamado.fonte
Meus 5 centavos (errados)
ATUALIZAR
Ouch, concordo totalmente @jpp, vou manter como um exemplo de má prática :(
fonte
'a' in "".join(['AB']).lower()
retornosTrue
quando isso não for o que o OP deseja.Eu precisava disso para um dicionário em vez da lista, a solução Jochen era a mais elegante para esse caso, então modifiquei um pouco:
agora você pode converter um dicionário assim
USERNAMESDICT = CaseInsensitiveDict(USERNAMESDICT)
e usarif 'MICHAEL89' in USERNAMESDICT:
fonte
Para colocá-lo em uma linha, foi o que eu fiz:
Eu não testei no tempo, no entanto. Não tenho certeza de quão rápido / eficiente é.
fonte