2017-05-24 3 views
0
>>> n 
['de', 'db', 'aa', 'dC', 'be', 'Ad', 'Da', 'a7', 'Cb', 'Cc', 'Ed', 'D7', 'CA', 'Da', 'db', 'aa', 'bD', 'db', '7d', 'Ad', 'c4', 'DA', 'Ba', 'bD', 'cc', 'DC', 'da', 'dd', '2d', 'CD', 'bA', 'dA', 'EC', 'Cb', 'dC', 'aC', 'Dd', 'ec', 'CD', 'Ae', 'aC', 'dE', 'BE', 'CE', 'db', 'AC', 'EC', 'cb', 'DE'] 

J'ai une liste comme ci-dessus. Je veux ajouter le caractère d'échappement '\ x' avant chaque élément. Je peux faire annexant comme « \ x », mais plus tard je veux joindre des éléments pour créer un caractère unicode et si je fais avec « \ x », sa ne fonctionne pasBesoin d'aide pour ajouter une séquence d'échappement à tous les éléments d'une liste qui sera utilisée par la suite pour unicode

S'il vous plaît suggèrent

+1

Montrez un exemple de la sortie désirée, et expliquez ce que «cela ne fonctionne pas» en incluant le message d'erreur. – DyZ

Répondre

2

Vous pouvez et devez utiliser binascii.unhexlify.

from binascii import unhexlify 

n = ['de', 'db', 'aa', 'dC', 'be', 'Ad', 'Da', 'a7', 'Cb', 'Cc', 'Ed', 'D7', 
    'CA', 'Da', 'db', 'aa', 'bD', 'db', '7d', 'Ad', 'c4', 'DA', 'Ba', 'bD', 
    'cc', 'DC', 'da', 'dd', '2d', 'CD', 'bA', 'dA', 'EC', 'Cb', 'dC', 'aC', 
    'Dd', 'ec', 'CD', 'Ae', 'aC', 'dE', 'BE', 'CE', 'db', 'AC', 'EC', 'cb', 'DE'] 

print(repr(unhexlify(''.join(n)))) 

Exemple d'utilisation de binascii.unhexlify: unhexlify('abcdef') # '\xab\xcd\xef'

Dans votre cas, les chiffres hexadécimaux sont stockés dans un list, vous devriez donc concaténer les premiers en utilisant str.join. Et passez-le simplement au binascii.unhexlify.

2

Vous ne pouvez pas le faire facilement dans le domaine de la chaîne. Heureusement, il est simple et juste en utilisant chrint:

>>> n = ['de', 'db', 'aa', 'dC', 'be', 'Ad', 'Da', 'a7', 'Cb', 'Cc', 'Ed', 'D7', 'CA', 'Da', 'db', 'aa', 'bD', 'db', '7d', 'Ad', 'c4', 'DA', 'Ba', 'bD', 'cc', 'DC', 'da', 'dd', '2d', 'CD', 'bA', 'dA', 'EC', 'Cb', 'dC', 'aC', 'Dd', 'ec', 'CD', 'Ae', 'aC', 'dE', 'BE', 'CE', 'db', 'AC', 'EC', 'cb', 'DE'] 
>>> [chr(int(k, 16)) for k in n] 
['Þ', 'Û', 'ª', 'Ü', '¾', '\xad', 'Ú', '§', 'Ë', 'Ì', 'í', '×', 'Ê', 'Ú', 'Û', 'ª', '½', 'Û', '}', '\xad', 'Ä', 'Ú', 'º', '½', 'Ì', 'Ü', 'Ú', 'Ý', '-', 'Í', 'º', 'Ú', 'ì', 'Ë', 'Ü', '¬', 'Ý', 'ì', 'Í', '®', '¬', 'Þ', '¾', 'Î', 'Û', '¬', 'ì', 'Ë', 'Þ'] 
2

Fournir une alternative à la réponse de hallazzang: Nous pouvons utiliser literal_eval pour tourner en toute sécurité la représentation de chaîne de l'unicode dans le caractère unicode. '\\xde', par exemple, évalue comme 'Þ'.

>>>from ast import literal_eval 
>>> 
>>>[ast.literal_eval("'\\x{}'".format(k)) for k in n] 
['Þ', 'Û', 'ª', 'Ü', '¾', '\xad', 'Ú', '§', 'Ë', 'Ì', 'í', '×', 'Ê', 'Ú', 'Û', 'ª', '½', 'Û', '}', '\xad', 'Ä', 'Ú', 'º', '½', 'Ì', 'Ü', 'Ú', 'Ý', '-', 'Í', 'º', 'Ú', 'ì', 'Ë', 'Ü', '¬', 'Ý', 'ì', 'Í', '®', '¬', 'Þ', '¾', 'Î', 'Û', '¬', 'ì', 'Ë', 'Þ'] 

Je signale que literal_eval est une alternative sûre à eval. eval permet d'exécuter du code arbitraire, tandis que literal_eval crée uniquement des littéraux, par exemple des ints, des chaînes, des listes et des dicts.