Retirer un élément d'une liste

Résolu
tomthiel Messages postés 11 Date d'inscription   Statut Membre Dernière intervention   -  
mamiemando Messages postés 33778 Date d'inscription   Statut Modérateur Dernière intervention   -

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 33778 Date d'inscription   Statut Modérateur Dernière intervention   7 884
 

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   Statut Membre Dernière intervention  
 

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   Statut Membre Dernière intervention  
 

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

0
mamiemando Messages postés 33778 Date d'inscription   Statut Modérateur Dernière intervention   7 884 > tomthiel Messages postés 11 Date d'inscription   Statut Membre Dernière intervention  
 

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
voji
 

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   Statut Membre Dernière intervention  
 

merci beaucoup pour votre aide !

0