Résolue

Supprimer un entier 1 sans supprimer True

# Listes # Python
l1 = [2, 3, 4, 5, 'flo', True, None, 'test', 't', 'y', 1]
l1.remove(1)
>>> [2, 3, 4, 5, 'flo', None, 'test', 't', 'y', 1]

En faisant l1.remove(1) je supprime le True. Si j'ai bien compris, True est un objet de type bool, qui est une sous-classe d'un int et qui vaut comme valeur 1. Du coup je comprends le fait que ça soit lui qui soit supprimé mais je trouve cela pas très pratique. Imaginons que je souhaite supprimer le premier entier 1 (et pas True) que je croise dans ma liste. Comment est ce que je peux faire ?

Gabriel Trouvé

Mentor

Salut !

Effectivement, comme True est une instance de bool (et bool hérite de int) ce qui fait qu'on a True == 1 dans une comparaison, c'est pour ça que l'appel à remove(1) supprime True et non pas un entier 1.

On peut contourner en vérifiant la valeur :

l1 = [2, 3, 4, 5, 'flo', True, None, 'test', 't', 'y', 1]

for i, val in enumerate(l1):
    if val == 1 and val is not True:
        l1.pop(i)
        break
print(l1)

Au début j'avais imaginé ceci :

list_with_one = [2, 5, "e", True, 1, 3, "a", 1, False]


def del_first_one(my_list):
    # Récupérer tous les index ayant la valeur 1 (mais pas True) :
    indices_for_one = [i for i, x in enumerate(my_list) if x == 1 and x is not True]
    if indices_for_one:
        # Supprimer la première valeur égale à 1, à l'aide des indices
        del my_list[indices_for_one[0]]
    return my_list


print(f"Liste en ayant supprimé tous les 1 : {[x for x in list_with_one if not (x == 1 and type(x) is int)]}")
print(f"Liste avec le premier 1 supprimé (à l'instar de la méthode 'remove()') : {del_first_one(list_with_one)}")

Mais m'inspirant du code de Gabriel j'ai pensé à cette possibilité à l'aide de next() :

def del_like_remove(my_list):
    my_list.pop(next((i for i, val in enumerate(l1) if val == 1 and type(val) is int), None))
    return my_list


l1 = [2, 3, 4, 5, 'flo', True, None, 1, 'test', 't', 'y', 1]
print(f"Premier 1 supprimé : {del_like_remove(l1)}")

Inscris-toi

(c'est gratuit !)

Inscris-toi

Tu dois créer un compte pour participer aux discussions.

Créer un compte

Rechercher sur le site

Formulaire de contact

Inscris-toi à Docstring

Pour commencer ton apprentissage.

Tu as déjà un compte ? Connecte-toi.