Python Challenge#2 =从字符串中删除字符

时间:2011-02-27 20:10:08

标签: python-3.x

我有代码:

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”。

6 个答案:

答案 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+(您正确地从输出中排除)
  • 1220个换行符( >从输出中排除)
  • 每一个 - 不,我不会泄露答案

只需将\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)

或者更好,使用正则表达式。