Создание словаря из списка специальных символов - PullRequest
0 голосов
/ 11 июля 2011

Я работаю над этим небольшим сценарием: в основном он отображает элементы списка (со специальными символами в нем) на его индекс для создания словаря.

#!/usr/bin/env python
#-*- coding: latin-1 -*-

ln1 = '?0>9<8~7|65"4:3}2{1+_)'
ln2 = "(*&^%$£@!/`'\][=-#¢"

refStr = ln2+ln1

keyDict = {}
for i in range(0,len(refStr)):
    keyDict[refStr[i]] = i


print "-" * 32
print "Originl: ",refStr
print "KeyDict: ", keyDict

# added just to test a few special characters
tsChr = ['£','%','\\','¢']

for k in tsChr:
    if k in keyDict:
        print k, "\t", keyDict[k]
    else: print k, "\t", "not in the dic."

Он возвращает результат следующим образом:

Originl:  (*&^%$£@!/`'\][=-#¢?0>9<8~7|65"4:3}2{1+_)
KeyDict:  {'!': 9, '\xa3': 7, '\xa2': 20, '%': 4, '$': 5, "'": 12, '&': 2, ')': 42, '(': 0, '+': 40, '*': 1, '-': 17, '/': 10, '1': 39, '0': 22, '3': 35, '2': 37, '5': 31, '4': 33, '7': 28, '6': 30, '9': 24, '8': 26, ':': 34, '=': 16, '<': 25, '?': 21, '>': 23, '@': 8, '\xc2': 19, '#': 18, '"': 32, '[': 15, ']': 14, '\\': 13, '_': 41, '^': 3, '`': 11, '{': 38, '}': 36, '|': 29, '~': 27}

, что хорошо, за исключением символов £, % и \, которые конвертируются в \xa3, \xa2 и \\ соответственно.Кто-нибудь знает, почему печать ln1 / ln2 просто отлично, а словарь - нет.Как я могу это исправить?Любая помощь с благодарностью.Приветствия !!


Обновление 1

Я добавил дополнительные специальные символы - # и ¢, и вот что я получаю после @Предложение Дункана:

! 9
? 7
? 20
% 4
$ 5
....
....
8 26
: 34
= 16
< 25
? 21
> 23
@ 8
? 19
....
....

Обратите внимание на 7-й, 19-й и 20-й элементы, которые вообще не печатаются правильно.21-й элемент - это действительный символ ?.Ура !!


Обновление 2

Просто добавили этот цикл в мое исходное сообщение, чтобы на самом деле проверить мою цель:

tsChr = ['£','%','\\','¢']
for k in tsChr:
    if k in keyDict:
        print k, "\t", keyDict[k]
    else: print k, "\t", "not in the dic."

и вот что яполучить в результате:

£   not in the dic.
%   4
\   13
¢   not in the dic.

Вист, запустив скрипт, думает, что £ и ¢ на самом деле отсутствуют в словаре - и это моя проблема.Кто-нибудь знает, как это исправить или что / где я делаю не так?

в конце концов, я буду проверять наличие символов в файле (или строке текста) в словаре, чтобы узнать, существует ли он, и есть ли вероятность наличия символа, подобного é или£ и так далее в тексте.Ура !!

Ответы [ 2 ]

6 голосов
/ 11 июля 2011

Когда вы печатаете словарь или список, содержащий строки, Python отображает repr() строк.Если вы print repr(ln2), то увидите, что ничего не изменилось: ваш словарный ключ - это всего лишь латинская кодировка «£» и т. Д.символов.

Если вы сделаете:

for k in keyDict:
    print k, keyDict[k]

, символы будут отображаться так, как вы ожидаете.

3 голосов
/ 11 июля 2011

По моему скромному мнению, было бы полезно узнать о юникоде в целом, и он используется в python

, если вам не интересно узнать, почему людичто-то напутать, так что вам придется иметь дело с \ xa3 вместо простого £, тогда ответ Дункана, приведенный выше, идеален и говорит вам все, что вы хотите знать.

Обновление (относительно вашего Обновления# 2)

, пожалуйста, подтвердите, что ваш файл сохранен с кодировкой латинской-1 и не utf-8 , как сейчас, и ваш тест пройдет (или просто измените #-*- coding: latin-1 -*- на #-*- coding: utf-8 -*-)

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

ваш файл сохранен как utf-8, это означает для char £ Используются 2 байта , но, поскольку вы указываете, что кодировка интерпретатора python является латинской-1, он будет использовать каждый из 2 байтов utf-8 из £ для ключа.

InfactЯ могу сосчитать 19 символов в ln2, но если вы выдадите len(ln2), он вернет 21.

Когда вы проверяете на '£' in keyDict.keys(), вы ищете строку из 2 символов, в то время как каждый из 2 символов имеет свой собственный ключ в словаре, поэтому он не найдет его.

ТакжеВы можете проверить len(keyDict) и найти, что это больше, чем вы ожидаете.

Я думаю, это все объясняет, пожалуйста, поймите, что не всю историю легко объяснить на одной веб-странице, но ссылка выше, в моей скромнойМнение - хорошая отправная точка, смешивая некоторые истории и некоторые примеры кодирования.

Cheers

PS: я использую этот код, сохраняя его как UTF-8, и он работает без нареканий:

#!/usr/bin/env python
#-*- coding: utf-8 -*-

ln1 = u'?0>9<8~7|65"4:3}2{1+_)'
ln2 = u"(*&^%$£@!/`'\][=-#¢"

refStr = u"%s%s" % (ln2, ln1)

keyDict = {}
for idx, chr_ in enumerate(refStr):
    print chr_,
    keyDict[chr_] = idx

print u"-" * 32
print u"Originl: ", refStr
print u"KeyDict: ", keyDict

tsChr = [u'£', u'%', u'\\', u'¢']
for k in tsChr:
    if k in keyDict.keys():
        print k, "\t", keyDict[k]
    else: print k, repr(k), "\t", "not in the dic."
...