Compare two lists without interference of upper and lower case letters

Asked

Viewed 81 times

5

I want to develop a log-in system where it does not allow new users to have the same names already used by other registered users, but I’m having a problem in case of upper and lower case letters when comparing the lists. How do I make the two lists all lower case?

current_users  = [ 'Hiquinho', 'pup', 'billy', 'jp', 'pichuto', 'schuh']
new_users = [ 'HIQUINHO', 'sara', 'Billy', 'amalia', 'lucca', 'Schuh']
if new_users:
    for new_user in new_users:
        if new_user.lower() in current_users:
            print('Nome ja em uso, forneça outro ID\n')
        elif new_user.lower() not in current_users:
            print('Seja bem vindo, somos muito gratos pelo seu login '
            + new_user.title() + '!\n')

2 answers

4


When the user name is 'HIQUINHO', when calling lower he becomes hiquinho, and you compare it to the values on the other list, which only has 'Hiquinho', why he thinks this user has not yet been used.

Therefore, you should compare each new user with the lowercase version of the current users:

current_users  = [ 'Hiquinho', 'pup', 'billy', 'jp', 'pichuto', 'schuh']
new_users = [ 'HIQUINHO', 'sara', 'Billy', 'amalia', 'lucca', 'Schuh']
current_users_lowercase = list(map(str.lower, current_users))

for new_user in new_users:
    if new_user.lower() in current_users_lowercase:
        print(f'Nome {new_user} já em uso, forneça outro ID')
    else:
        print(f'Seja bem vindo, somos muito gratos pelo seu login {new_user.title()}!')

Also note that you don’t need to test the list new_users is empty. If it is, it doesn’t even enter the for, then the if new_users: is redundant.

And the condition of elif is also redundant. If the user is in the list, he if, and if it’s not, it goes to the else (I mean, you don’t need to test this again with elif, can use else straightforward).

The exit code above is:

Nome HIQUINHO já em uso, forneça outro ID
Seja bem vindo, somos muito gratos pelo seu login Sara!
Nome Billy já em uso, forneça outro ID
Seja bem vindo, somos muito gratos pelo seu login Amalia!
Seja bem vindo, somos muito gratos pelo seu login Lucca!
Nome Schuh já em uso, forneça outro ID

It is worth remembering that, depending on the characters that may have in the user’s name, not always lower() works. For example, the German character ß is equivalent to "ss", but lower() does not change it. For these - and many others - cases, the documentation recommends the use of casefold:

print('ß'.lower()) # ß
print('ß'.casefold()) # ss

I mean, you could just switch to:

current_users  = [ 'Hiquinho', 'pup', 'billy', 'jp', 'pichuto', 'schuhss']
new_users = [ 'HIQUINHO', 'sara', 'Billy', 'amalia', 'lucca', 'Schuhß']

# usar casefold em vez de lower
current_users_lowercase = list(map(str.casefold, current_users))

for new_user in new_users:
    if new_user.casefold() in current_users_lowercase: # usar casefold em vez de lower
        print(f'Nome {new_user} já em uso, forneça outro ID')
    else:
        print(f'Seja bem vindo, somos muito gratos pelo seu login {new_user.title()}!')

Of course, if you only have ASCII characters, use lower is enough.

  • 1

    thank you very much!

4

If the goal is just to send the greeting message without having to do any additional configuration action it is possible to use a more functional approach using a lambda expression applied with the builtin map() inside comprehensilist on the text to be displayed is decided through a conditional expression.

current_users  = [ 'Hiquinho', 'pup', 'billy', 'jp', 'pichuto', 'schuh']
new_users = [ 'HIQUINHO', 'sara', 'Billy', 'amalia', 'lucca', 'Schuh', 'User1']

#Converte cada elemento de current_users caixa alta e armazena no array users
users= [str.casefold(e) for e in current_users]

#Junta todos os log e os imprime separados por um \n
print("\n".join([      
    #Operador ternário se t[0] for true devolve a primeira frase senão devolve a outra.
    f'{str.title(t[1])} já está em uso, forneça outro ID.' 
    if t[0] else f'Seja bem vindo {str.title(t[1])}, obrigado pelo login!'
    #Para cada elemento e em new_users retorna a tupla t (str.casefold(e) in users, e).
    for t in map(lambda e : (str.casefold(e) in users, e), new_users) 
]))

Upshot:

Hiquinho ja em uso, forneça outro ID.
Seja bem vindo Sara, obrigado pelo login!
Billy ja em uso, forneça outro ID.
Seja bem vindo Amalia, obrigado pelo login!
Seja bem vindo Lucca, obrigado pelo login!
Schuh ja em uso, forneça outro ID.
Seja bem vindo User1, obrigado pelo login!

Test the example on repl it.

If the objective is to perform one or more actions I depend on the outcome of the verification that the new_users whether or not contained in current_users you can use a more imperative flow control using for and if:

current_users  = [ 'Hiquinho', 'pup', 'billy', 'jp', 'pichuto', 'schuh']
new_users = [ 'HIQUINHO', 'sara', 'Billy', 'amalia', 'lucca', 'Schuh', 'User1']

#Converte cada elemento de current_users caixa alta e armazena no array users
users= [str.casefold(e) for e in current_users]

#Essa lista irá receber os nomes de usuário que estiver em new_users e 
# que não estejam em current_users.
trusted_users = []

#Para cada elemento e em new_users retorna a tupla t (str.casefold(e) in users, e).
for t in map(lambda e : (str.casefold(e) in users, e), new_users):
  #Verifica resultado da expressão str.casefold(e)...
  if t[0]: 
    #...se True o usuário já está em uso.
    print(f'{str.title(t[1])} já em uso, forneça outro ID.')
  else:
    #...se False o nome de usuário ainda não está em uso.
    trusted_users.append(t[1]) #... o adiciona a lista trusted_users.
    print(f'Seja bem vindo {str.title(t[1])}, obrigado pelo login!')

#Imprime a lista trusted_users.
print(f'\nNovos usuários verificados: {trusted_users}')

Upshot:

Hiquinho ja em uso, forneça outro ID.
Seja bem vindo Sara, obrigado pelo login!
Billy ja em uso, forneça outro ID.
Seja bem vindo Amalia, obrigado pelo login!
Seja bem vindo Lucca, obrigado pelo login!
Schuh ja em uso, forneça outro ID.
Seja bem vindo User1, obrigado pelo login!

Novos usuários verificados: ['sara', 'amalia', 'lucca', 'User1']

Test the code on repl it.

  • 1

    thank you very much!

Browser other questions tagged

You are not signed in. Login or sign up in order to post.