Retirer un élément d'une liste

Résolu/Fermé
tomthiel Messages postés 11 Date d'inscription samedi 5 février 2022 Statut Membre Dernière intervention 22 octobre 2022 - Modifié le 18 oct. 2022 à 18:02
mamiemando Messages postés 33381 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 26 novembre 2024 - 25 oct. 2022 à 15:21

Bonsoir a tous j'ai un problème avec mon programme, j'aimerais supprimer un élément d'une liste en l'occurence ici : 00100000. Mais je ne trouve pas la commande idéal, a chaque fois je tombe sur des erreurs de type str, ou int. 

J'ai juste actuellement le paramètre : liste.remove('00100000') mais il ne fonctionne pas.

Merci de votre aide.

def ASCII_phrase(phrase):
    tab = []
    for i in phrase:
        liste = list("{:08b}".format(ord(i)))
        liste.remove('00100000')
        tab.append(''.join(liste))
        binPHRASE_ASCII=' '.join(tab)
    return binPHRASE_ASCII

print(ASCII_phrase('Codage ASCII'))
A voir également:

2 réponses

mamiemando Messages postés 33381 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 26 novembre 2024 7 802
Modifié le 18 oct. 2022 à 18:23

Bonjour,

Tu devrais afficher avant de faire le liste.remove(...) ce que contient ta liste en insérant devant la commande :

print(liste)

À ce stade, à chaque itération, tu récupère le prochain caractère de phrase, puis transforme ce caractère i en une liste de 8 caractères, et dont la valeur du i-ème caractère est '0' ou '1' selon la valeur i-ème bit de la représentation binaire du caractère traité.

Si on fait le premier tour de boucle, dans ton exemple, i prend la valeur 'C', soit 67 en décimal (résultat de ord('C')), soit la chaîne '01000011' après formatage, et donc ta liste contient ['0', '1', '0', '0', '0', '0', '1', '1']. Du coup elle ne risque pas de contenir '00100000'.

Ici le code que tu sembles vouloir écrire consiste à retirer le caractère dont le code ASCII en binaire est 00100000 soit 32 en décimal, ce qui correspond au caractère espace.

Voici donc deux manières plus naturelles d'écrire ta boucle :

for a in phrase:
    if ord(a) != 0b00100000:
        ...

for a in phrase:
     if a != ' ':
        ...

# Si tu veux traiter tous les caractères espacés (tabulations...)
for a in phrase:
     if not a.isspace():
        ...

Ensuite, si j'ai bien compris ce que tu cherches à écrire, en réalité tu cherches à retourner une liste qui contient la représentation binaire d'une chaîne de caractère arbitraire en ignorant les espaces. Je ne sais pas pourquoi tu fais un traitement particulier sur les espaces (ni pourquoi, dans ce cas, tu ne traites pas les tabulations), mais tout ceci ne me regarde pas :-) 

Si ma compréhension est correcte, voici comment retourner la représentation binaire (sous forme d'une chaîne de caractère) d'une chaîne s hormis les caractères espacés (espace, tabulation...) :

def str_to_bin(s: str) -> str:
    return "".join(
        f"{ord(a):8b}"
        for a in s
        if not a.isspace()
    )

Exemple :

print(str_to_bin("Codage ASCII"))
# '0100001101101111011001000110000101100111011001010100000101010011010000110100100101001001'

Bonne chance

1
tomthiel Messages postés 11 Date d'inscription samedi 5 février 2022 Statut Membre Dernière intervention 22 octobre 2022
22 oct. 2022 à 07:32

Merci grandement pour votre investissement, j'ai bien compris grâce à vous et j'ai réussi, merci !

0
tomthiel Messages postés 11 Date d'inscription samedi 5 février 2022 Statut Membre Dernière intervention 22 octobre 2022
22 oct. 2022 à 10:27

j'aurais une dernière question, serait-il possible d'inserer un espace entre chaque moi ?

0
mamiemando Messages postés 33381 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 26 novembre 2024 7 802 > tomthiel Messages postés 11 Date d'inscription samedi 5 février 2022 Statut Membre Dernière intervention 22 octobre 2022
Modifié le 25 oct. 2022 à 15:28

Il suffit de corriger la boucle pour itérer de mot en mot, puis sur chaque mot de caractère en caractère. Ensuite à toi de choisir la chaîne qui sépare chaque élément itéré. Dans l'exemple ci-dessous je sépare chaque mot par "|" et chaque caractère par "-". Tu peux si tu le souhaites utiliser comme séparateur la chaîne vide.

Code :

def str_to_bin(s: str) -> str:
    return "|".join(
      "-".join( 
        f"{ord(a):08b}"
        for a in word
        if not a.isspace()
      )
      for word in s.split()
   )

Exemple :

print(str_to_bin("Codage en ASCII"))
# '01000011-01101111-01100100-01100001-01100111-01100101|01100101-01101110|01000001-01010011-01000011-01001001-01001001'
0

Bonjour, ta fonction n'est pas bien claire, je ne comprends pas ce qu'elle doit faire, de plus rien ne garanti que le binaire 00100000 soit dans ta liste, donc forcément, il y aura une erreur, donc une simple exception fera l'affaire.

def ASCII_phrase(phrase):
    tab = ["{:08b}".format(ord(i)) for i in phrase]
    try:
        tab.remove('00100000')
    except ValueError:
        pass
    return ' '.join(tab)
0
tomthiel Messages postés 11 Date d'inscription samedi 5 février 2022 Statut Membre Dernière intervention 22 octobre 2022
22 oct. 2022 à 07:32

merci beaucoup pour votre aide !

0