我正在研究这个小脚本:基本上它将列表元素(包含特殊字符)映射到其索引以创建字典。
#!/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
很好但字典不是。我怎样才能解决这个问题?任何帮助非常感谢。干杯!!
我添加了额外的特殊字符 - #
和¢
,这就是我遵循@Duncan的建议:
! 9
? 7
? 20
% 4
$ 5
....
....
8 26
: 34
= 16
< 25
? 21
> 23
@ 8
? 19
....
....
请注意第7,19和20个元素,它们根本无法正确打印。第21个元素是实际的?
字符。干杯!!
刚刚将此循环添加到我的原始帖子中以实际测试我的目的:
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}}等文中的内容。干杯!!
答案 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回答上面是完美的,并告诉你你想知道的一切。
请断言您的文件使用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."