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