我想创建一个程序,通过根据单词在单词中的第一个位置添加给它的字母来计算单词的“值”(作为练习,我是Python的新手)。
IE浏览器。 "foo"
将返回5(因为'f'= 1,'o'= 2)而"bar"
将返回6(因为'b'= 1,'a'= 2,'r'= 3 )。
到目前为止,这是我的代码:
# -*- coding: utf-8 -*-
def ppn(word):
word = list(word)
cipher = dict()
i = 1
e = 0
for letter in word:
if letter not in cipher:
cipher[letter] = i
e += i
i += 1
else:
e += cipher[letter]
return ''.join(word) + ": " + str(e)
if __name__ == "__main__":
print ppn(str(raw_input()))
它运行良好,但对于包含'ł','±'等字符的单词,它不会返回正确的值(我猜它是因为它首先将这些字母转换为Unicode代码)。有没有办法绕过它并让翻译人员将所有字母视为单个字母?
答案 0 :(得分:2)
将输入解码为unicode,然后在任何地方使用unicode,然后在输出时解码。
具体而言,您需要更改
print ppn(str(raw_input()))
要
print ppn(raw_input().decode(sys.stdin.encoding))
这将解码您的输入。然后你还需要改变
''.join(word) + ": " + str(e)
要
u''.join(word) + u': ' + unicode(e)
这使得所有代码都在内部使用unicode对象。
打印会将unicode正确编码为终端正在使用的编码,但如果需要,也可以指定。
或者你可以完全按照你已经拥有的那样做,但是用python 3运行它。
有关详细信息,请阅读此非常有用的talk on the subject
答案 1 :(得分:2)
使用shell的编码进行解码:
if __name__ == "__main__":
import sys
print ppn((raw_input()).decode(sys.stdin.encoding))
对于Unix系统,通常UTF-8
有效。在Windows上,事情可能会有所不同。要保存使用sys.stdin.encoding
。你永远不知道你的脚本将在哪里运行。
或者,甚至更好。切换到Python 3:
# -*- coding: utf-8 -*-
import sys
assert sys.version_info.major > 2
def ppn(word):
word = list(word)
cipher = dict()
i = 1
e = 0
for letter in word:
if letter not in cipher:
cipher[letter] = i
e += i
i += 1
else:
e += cipher[letter]
return ''.join(word) + ": " + str(e)
if __name__ == "__main__":
print(ppn(str(input())))
在Python 3中,默认情况下字符串是unicode。所以不需要解码业务。
答案 2 :(得分:2)
到目前为止,所有的答案都解释了该怎么做,但没有说明发生了什么,所以这里有一些提示。
当您在Python 2中使用raw_input()
时,会返回一个字节字符串(Python 3上的input()
表现不同)。大多数unicode字符不能表示为单个字节,因为unicode字符多于可用字节表示的值。
ł
或ą
等字符,当使用utf-8或其他编码进行编码时,可能需要两个字节或更多字节:
>>> 'ł'
'\xc5\x82'
>>> 'ą'
'\xc4\x85'
您的原始程序将这两个字节解释为不同的字符,从而导致错误的结果。
Python提供了字节字符串的替代方法:unicode字符串。使用unicode字符串时,一个字符恰好显示为一个字符(字符串的内部表示形式是不透明的),并且您遇到的问题不会发生。
因此,将bytestring解码为unicode字符串是可行的方法。