2015-06-20 9 views
-2

Я хочу обратить раскладку клавиш для следующего словаря:Обработка специальных символов/юникода и порядок в словаре при движении задним ходом отображение

joy2gurbaniakhar = {'T':'a', 'n':'A', 'J':'e', ';':'s', 'j':'h', 'e':'k', 'y':'K', 'r':'g', 'x':'G', 'C':'|', 'u':'c', 'S':'c', 'i':'j', 'M':'J', 'R':'\\', 'N':'t', 'm':'T', 'v':'f', 'Y':'F', 'D':'x', 's':'q', 'E':'Q', 'd':'d', 'X':'D', 'B':'n', 'g':'p', 'c':'P', 'p':'b', 'G':'B', 'w':'m', ':':'X', 'o':'r', 'b':'l', 't':'v', 'V':'V', 'ô':'S', 'õ':'^', 'ö':'Z', '÷':'z', 'ø':'&', 'ÿ':'L', 'z':'M', 'k':'w', 'h':'I', 'f':'‍i', '/':'y', 'q':'R', 'H':'.', '[':'u', '{':'U', '\'':'o', '\"':'O', 'K':'W', 'F':'-','.':'[', 'A':'N', 'Z':'~', '?':'ੈ', '+':'Y', 'ý':'Å', 'ú':'E', 'J[':'ey', 'T{':'aU', 'T[':'au', 'Jh':'eI', 'fJ':'ie', 'nk':'Aw', 'n\"':'AO', 'n?':'AY', 'W':'hY', 'ù':'ƒ'} 

я использовал следующий код для обратного отображения:

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 
reverse_maping = {v: k for k, v in joy2gurbaniakhar.items()} 
print reverse_maping 

Это хорошо работает, но я получаю следующее сопоставление, которое содержит значения Unicode специальных символов и неправильный серийный порядок словаря, например:

reverse_maping = {'V': 'V', '\xc3\x85': '\xc3\xbd', 'w': 'k', 'Y': '+', 'ey': 'J[', 'ie': 'fJ', 'eI': 'Jh', '&': '\xc3\xb8', '-': 'F', '.': 'H', 'aU': 'T{', 'b': 'p', 'A': 'n', '\xc6\x92': '\xc3\xb9', 'B': 'G', 'E': '\xc3\xba', 'D': 'X', 'G': 'x', 'F': 'Y', 'I': 'h', 'K': 'y', 'J': 'M', 'M': 'z', 'L': '\xc3\xbf', 'O': '"', 'N': 'A', '\xe0\xa9\x88': '?', 'P': 'c', 'S': '\xc3\xb4', 'R': 'q', '\xe2\x80\x8di': 'f', 'T': 'm', 'W': 'K', 'x': 'D', 'AY': 'n?', 'X': ':', '[': '.', 'Z': 'ö', 'U': '{', '\\': 'R', '^': '\xc3\xb5', 'a': 'T', 'Q': 'E', 'c': 'u', 'hY': 'W', 'e': 'J', 'd': 'd', 'g': 'r', 'f': 'v', 'AO': 'n"', 'h': 'j', 'k': 'e', 'j': 'i', 'm': 'w', 'l': 'b', 'o': "'", 'n': 'B', 'q': 's', 'p': 'g', 's': ';', 'r': 'o', 'u': '[', 't': 'N', 'Aw': 'nk', 'v': 't', 'y': '/', 'au': 'T[', 'z': '÷', '|': 'C', '~': 'Z'} 

Это должно быть как:

reverse_mapping = {'a':'T', 'A':'n', 'e':'J'.......} 
+0

В чем проблема? – Eric

+1

_ "анонимный серийный номер" _? – Eric

+0

Вы видите результат вывода, если вы печатаете joy2gurbaniakhar, вы увидите тот же результат. Если вы на самом деле печатаете каждую клавишу, вы увидите вывод str –

ответ

1

Словари не определен порядок, поэтому не следует ожидать конкретного одного. Определите свою собственную функцию отображения для словаря, если вы хотите его определенным образом:

#!python2 
# -*- coding: utf-8 -*- 
joy2gurbaniakhar = {'T':'a', 'n':'A', 'J':'e', ';':'s', 'j':'h', 'e':'k', 'y':'K', 'r':'g', 'x':'G', 'C':'|', 'u':'c', 'S':'c', 'i':'j', 'M':'J', 'R':'\\', 'N':'t', 'm':'T', 'v':'f', 'Y':'F', 'D':'x', 's':'q', 'E':'Q', 'd':'d', 'X':'D', 'B':'n', 'g':'p', 'c':'P', 'p':'b', 'G':'B', 'w':'m', ':':'X', 'o':'r', 'b':'l', 't':'v', 'V':'V', 'ô':'S', 'õ':'^', 'ö':'Z', '÷':'z', 'ø':'&', 'ÿ':'L', 'z':'M', 'k':'w', 'h':'I', 'f':'‍i', '/':'y', 'q':'R', 'H':'.', '[':'u', '{':'U', '\'':'o', '\"':'O', 'K':'W', 'F':'-','.':'[', 'A':'N', 'Z':'~', '?':'ੈ', '+':'Y', 'ý':'Å', 'ú':'E', 'J[':'ey', 'T{':'aU', 'T[':'au', 'Jh':'eI', 'fJ':'ie', 'nk':'Aw', 'n\"':'AO', 'n?':'AY', 'W':'hY', 'ù':'ƒ'} 
reverse_mapping = {v: k for k, v in joy2gurbaniakhar.iteritems()} 

def prettystr(D): 
    return '{'+', '.join("'{}': '{}'".format(k,v) for k,v in sorted(D.iteritems()))+'}' 

print prettystr(reverse_mapping) 

Выход:

{'&': 'ø', '-': 'F', '.': 'H', 'A': 'n', 'AO': 'n"', 'AY': 'n?', 'Aw': 'nk', 'B': 'G', 'D': 'X', 'E': 'ú', 'F': 'Y', 'G': 'x', 'I': 'h', 'J': 'M', 'K': 'y', 'L': 'ÿ', 'M': 'z', 'N': 'A', 'O': '"', 'P': 'c', 'Q': 'E', 'R': 'q', 'S': 'ô', 'T': 'm', 'U': '{', 'V': 'V', 'W': 'K', 'X': ':', 'Y': '+', 'Z': 'ö', '[': '.', '\': 'R', '^': 'õ', 'a': 'T', 'aU': 'T{', 'au': 'T[', 'b': 'p', 'c': 'u', 'd': 'd', 'e': 'J', 'eI': 'Jh', 'ey': 'J[', 'f': 'v', 'g': 'r', 'h': 'j', 'hY': 'W', 'ie': 'fJ', 'j': 'i', 'k': 'e', 'l': 'b', 'm': 'w', 'n': 'B', 'o': ''', 'p': 'g', 'q': 's', 'r': 'o', 's': ';', 't': 'N', 'u': '[', 'v': 't', 'w': 'k', 'x': 'D', 'y': '/', 'z': '÷', '|': 'C', '~': 'Z', 'Å': 'ý', 'ƒ': 'ù', 'ੈ': '?', '‍i': 'f'} 

Примечание это будет печатать только правильно на терминале UTF-8, поскольку она имеет дело с сырым UTF -8 байтовых строк. Вы должны использовать строки Unicode u'xxx' вместо ваших ключей и значений.

+0

Спасибо @mark :) –