Supprimer un entier 1 sans supprimer True
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 ?
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 !)
Tu dois créer un compte pour participer aux discussions.
Créer un compte