Python 从特殊字符列表创建字典
我正在编写这个小脚本:基本上,它将列表元素(其中包含特殊字符)映射到其索引以创建字典Python 从特殊字符列表创建字典,python,dictionary,sorteddictionary,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
#!/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."
请注意,第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.
当运行脚本时,它认为
和
实际上不在字典中-这是我的问题。有人知道如何解决这个问题,或者我做错了什么/哪里做错了
最后,我将检查字典中文件(或一行文本)中的字符,以查看它是否存在,以及是否有可能在文本中包含类似于
的字符。干杯 打印包含字符串的词典或列表时,Python将显示字符串的repr()
。如果您print repr(ln2)
您将看到没有任何变化:您的字典键只是“£”和c的拉丁-1编码。人物
如果您这样做:
for k in keyDict:
print k, keyDict[k]
然后字符将如您所期望的那样显示。以我的拙见,了解unicode的一般知识和
如果你不想知道为什么人们要把事情搞砸,所以你必须处理一个“\xa3”而不是一个简单的”
,那么邓肯的回答是完美的,并告诉你你想知道的一切
更新(关于您的更新#2)
请声明您的文件是使用拉丁-1编码和非utf-8保存的,您的测试将通过(或者将#-*-编码:拉丁-1-*-
更改为#-*-编码:utf-8-*-
)
这是一个你可以很容易地从我上面的链接中理解阅读(和理解)内容的东西:
您的文件保存为utf-8,这意味着对于char
使用了2个字节,但由于您告诉python解释器编码是拉丁-1,他将使用
的2个utf-8字节中的每个字节作为密钥
实际上,我可以在ln2
中计算19个字符,但如果您发出len(ln2)
它将返回21个字符
当您在keyDict.keys()中测试“*”时,您正在寻找一个2字符字符串,而每个2字符在字典中都有自己的键,这就是它找不到它的原因
您还可以测试len(keyDict)
,发现它比您预期的要长
我想这解释了一切,请理解不是所有的故事都很容易在一个网页上解释,但在我看来,上面的链接是一个很好的起点,混合了一些故事和一些编码示例
干杯
注:我正在使用这段代码,并将其保存为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."
#/usr/bin/env python
#-*-编码:utf-8-*-
ln1=u’?0>9完全没有问题!关于风格,你可以在enumerate(refStr)中为i,x做:keyDict[x]=i
@Rosh:谢谢你的建议。@Roman:首先这不是问题,其次,OP应该在哪里/如何了解为什么
表示为\xa3
?只是为了澄清一下:在我的外壳上(utf-8)
是\xc2\xa3
和'>。解码('utf-8')。编码('latin-1')
是\xa3
。我想我们讨论的是字符编码,而学习unicode是一个很好的起点。@Roman:我确实看了你提到的那页,这实际上无助于回答我的问题。干杯@MacUsers:如果你只是想知道火花塞的作用(火花),而不是它为什么在那里,那么你是对的,我想你想知道为什么
需要表示为\xa3
,并且它会根据你选择的编码而变化。如果不是的话,恐怕我猜错了…@neurino:我不认为你真的明白你想在这里说的意思(为我的无知道歉),但是如果你看看原始帖子(我现在更新了新行),希望你能理解我最初的问题是什么。如果您能提供任何解决方案,我们将不胜感激。干杯我已经更新了我原来的帖子。惠斯特几乎成功了,但对他们中的少数人来说仍然不起作用。干杯在这一点上,我想这个问题的完美答案是它是这样工作的,继续生活下去…@neurino:那么,你的意思是说python不能处理所有这些特殊字符?我很难相信,即使我的python知识有限。对不起@MacUsers:请更新我的答案,我想它会澄清一切(我希望)
for k in keyDict:
print k, keyDict[k]
#!/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."