从特殊字符列表创建字典

时间:2011-07-11 14:22:02

标签: python dictionary sorteddictionary

我正在研究这个小脚本:基本上它将列表元素(包含特殊字符)映射到其索引以创建字典。

#!/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

我添加了额外的特殊字符 - #¢,这就是我遵循@Duncan的建议:

! 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.

Whist运行脚本,它认为£¢实际上不在字典中 - 这就是我的问题。任何人都知道如何解决这个问题或者我做错了什么/在哪里?

最终,我将检查字典中的文件(或文本行)中的字符,看它是否存在,并且有可能有像é或{{}}这样的字符。 {1}}等文中的内容。干杯!!

2 个答案:

答案 0 :(得分:6)

当您打印包含字符串的字典或列表时,Python将显示字符串的repr()。如果您print repr(ln2),您会发现没有任何变化:您的词典密钥只是'£'&amp; c的latin-1编码。字符。

如果你这样做:

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

然后字符将按预期显示。

答案 1 :(得分:3)

以我的拙见,了解一般的unicode和it's use in python

是有用的。

如果你有兴趣知道为什么人们不得不搞乱事情所以你必须处理一个'\ xa3'而不是只有一个简单£然后Duncan回答上面是完美的,并告诉你你想知道的一切。

更新(关注您的更新#2)

请断言您的文件使用latin-1编码和非utf-8 保存,因为它现在已经通过(或只是将#-*- coding: latin-1 -*-更改为#-*- coding: utf-8 -*-

您可以从上面的链接中轻松理解阅读(和理解)内容:

你的文件保存为utf-8这意味着char £ 使用2个字节但是因为你告诉python解释器编码是latin-1他将使用每个密钥的£的2 utf-8字节

事实上,我可以在ln2中计算19个字符,但如果您发出len(ln2),它将返回21。

当你测试'£' in keyDict.keys()时,你正在寻找一个2-char字符串,而每个2-chars在字典中都有自己的密钥,这就是为什么它找不到它。

此外,您可以测试len(keyDict)并发现它比您预期的更长。

我想这解释了一切,请理解并非所有的故事都很容易在一个网页上解释,但上面的链接,在我的拙见中是一个很好的起点,混合了一些故事和一些编码示例。

干杯

P.S。:我正在使用此代码,将其保存为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."