我有代码:
theory = """}#)$[]_+(^_@^][]_)*^*+_!{&$##]((](}}{[!$#_{&{){
*_{^}$#!+]{[^&++*#!]*)]%$!{#^&%(%^*}@^+__])_$@_^#[{{})}$*]#%]{}{][@^!@)_[}{())%)
())&#@*[#}+#^}#%!![#&*}^{^(({+#*[!{!}){(!*@!+@[_(*^+*]$]+@+*_##)&)^(@$^]e@][#&)(
%%{})+^$))[{))}&$(^+{&(#%*@&*(^&{}+!}_!^($}!(}_@@++$)(%}{!{_]%}$!){%^%%@^%&#([+[
_+%){{}(#_}&{&++!@_)(_+}%_#+]&^)+]_[@]+$!+{@}$^!&)#%#^&+$@[+&+{^{*[@]#!{_*[)(#[[
]*!*}}*_(+&%{&#$&+*_]#+#]!&*@}$%)!})@&)*}#(@}!^(]^@}]#&%)![^!$*)&_]^%{{}(!)_&{_{
+[_*+}]$_[#@_^]*^*#@{&%})*{&**}}}!_!+{&^)__)@_#$#%{+)^!{}^@[$+^}&(%%)&!+^_^#}^({
*%]&@{]++}@$$)}#]{)!+@[^)!#[%@^!!"""
#theory = open("temp.txt")
key = "#@!$%+{}[]_-&*()*^@/"
new2 =""
print()
for letter in theory:
if letter not in key:
new2 += letter
print(new2)
这是解决python挑战的测试代码#2:http://www.pythonchallenge.com/pc/def/ocr.html
唯一的麻烦是,我写的代码似乎留下了很多空白,但我不确定原因。
有关如何去除不必要的白色的任何想法?换句话说,我希望代码返回“e”而不是“e”。
答案 0 :(得分:7)
挑战在于找到一个罕见的角色。您可以使用collections.Counter
:
from collections import Counter
c = Counter(theory)
print(c.most_common()[-1])
('e', 1)
可以使用.strip()
删除不必要的空格:
new2.strip()
将'\n'
添加到key
也可以。
答案 1 :(得分:2)
最好的方法是使用正则表达式库,如此
import re
characters = re.findall("[a-zA-Z]", sourcetext)
print ("".join(characters))
在结果字符串中,您只能使用字母字符。
答案 2 :(得分:1)
如果你看一下字符的分布(使用collections.Counter
),你会得到:
)@(]#_%[}!+$&{*^
6000+(您正确地从输出中排除)只需将\n
添加到key
变量即可排除不需要的换行符。这将为您留下您需要的罕见(即仅出现1个)字符。
P.S。,在循环中连接字符串非常低效。而不是:
new2 =""
for letter in theory:
if letter not in key:
new2 += letter
写:
new2 = ''.join(letter for letter in theory if letter not in key)
答案 3 :(得分:1)
theory
字符串包含多个换行符。它们由您的代码打印出来。您可以删除换行符,如下所示:
theory = "}#)$[]_+(^_@^][]_)*^*+_!{&$##]((](}}{[!$#_{&{){" \
"*_{^}$#!+]{[^&++*#!]*)]%$!{#^&%(%^*}@^+__])_$@_^#[{{})}$*]#%]{}{][@^!@)_[}{())%)" \
"())&#@*[#}+#^}#%!![#&*}^{^(({+#*[!{!}){(!*@!+@[_(*^+*]$]+@+*_##)&)^(@$^]e@][#&)(" \
"%%{})+^$))[{))}&$(^+{&(#%*@&*(^&{}+!}_!^($}!(}_@@++$)(%}{!{_]%}$!){%^%%@^%&#([+[" \
"_+%){{}(#_}&{&++!@_)(_+}%_#+]&^)+]_[@]+$!+{@}$^!&)#%#^&+$@[+&+{^{*[@]#!{_*[)(#[[" \
"]*!*}}*_(+&%{&#$&+*_]#+#]!&*@}$%)!})@&)*}#(@}!^(]^@}]#&%)![^!$*)&_]^%{{}(!)_&{_{" \
"+[_*+}]$_[#@_^]*^*#@{&%})*{&**}}}!_!+{&^)__)@_#$#%{+)^!{}^@[$+^}&(%%)&!+^_^#}^({" \
"*%]&@{]++}@$$)}#]{)!+@[^)!#[%@^!!"
或者您可以过滤掉它们,如下所示:
key = "#@!$%+{}[]_-&*()*^@/\n"
两者都很好(是的,我测试过)。
答案 4 :(得分:0)
输出答案的更简单方法是:
print ''.join([ c for c in theory if c not in key])
在您的情况下,您可能希望将换行符添加到键中以将其过滤掉:
key += "\n"
答案 5 :(得分:-1)
你最好反向工作,如下:
out = []
for i in theory:
a = ord(i)
if (a > 96 and a < 122) or (a > 65 and a < 90):
out.append(chr(a))
print ''.join(out)
或者更好,使用正则表达式。