玩python挑战时遇到的奇怪问题。

玩python挑战时遇到的奇怪问题。

昨天开始玩python挑战,很喜欢这种通过游戏来锻炼编程技巧的方法。  推荐大家都试试
http://www.pythonchallenge.com/

玩到第二关(其实是第三关)时  任务是要从一大堆代码中找出稀少的字母。并按照这些稀少字母在其中的位置排列    (find rare characters in the mess below)


我的解决方法是  先把 那大堆代码 写入一个叫 txt 的文件

words = []
def find(i):
    if i in str(open('/home/lvscar/Desktop/txt','r').readlines()) :
           words.append(i)

for x in range(97,122) :
     find(chr(x))

#words = ['a', 'e', 'i', 'l', 'n', 'q', 't', 'u', 'y']

haha = ''

for i in str(open('/home/lvscar/Desktop/txt','r').readlines()) :
    if i in words:
        haha = haha + i
haha = haha.replace('n','')

print haha

但令我很奇怪的一点是  如果上面的代码没有 haha.replace 这段 。。  最后产生的haha中就会夹杂着很多的“n“ 字符。。。

为什么会这样呢 ?  

请高手给我解释解释  
                    谢谢!
关于这个问题解法有些问题。find rare characters in the mess below,的确是找出字母的意思,但找的同时自然就排序了,不必特意的处理。

按你所说先将大段文本保存在文件中,如a.txt,然后代码为:

s = []
for i in file('a.txt').read():
    if i.isalpha():
        s.append(i)
print ''.join(s)

答案为:
equality

你写了一个find函数,但却是每次对整个文件的所有字符进行处理。而且只是对小写字母进行了循环。结果是:处理一个字母,你要对整个文件扫描一次,这样带来的问题是:

1. 不能处理大写字母
2. 不能保证出现的顺序
3. 性能极低

我的方法是对整个文件只作一次扫描,扫描到一个字母即判断它是否是字母。python的字符串本身就有判断是否是字母的方法。而且对于整个文件直接使用read()即可,不必使用readlines()。因为回车符不是英文字母自然会过滤掉。

而且合并字符串列表使用字符本身的方法join即可完成。也不必再次对文件进行扫描去定位。也不会出现你所说的n字符的问题。

建议再多熟悉下python内置对象的方法及使用。

呵呵,,刚学python。。确实很多超有用的对象方法还不知道。    要是知道 string有 isalpha  的话, 就舒服多了。  
本来,我是把range扩大到(0,255)的。  然后再把所有出现的字符排序。   下面是用dict来做的方法。
dic = open("txt").read()
d = {}
for ch in dic:
    d[ch] = d.get(ch, 0) + 1

还有一种方法,在我这里通不过。老大帮忙看看
txt = open('/home/lvscar/Desktop/txt','r').readlines()
import string
filter(lambda x: x in string.letters, txt)
d = {}
for ch in dic:
    d[ch] = d.get(ch, 0) + 1

这是要做什么,没看懂。

filter 要的是一个list,txt是一个list,但它是一个字符串的list。为什么这么喜欢readlines()呢?使用read()应该可以了。
THX。

dic = open("txt").read()
d = {}
for ch in dic:
    d[ch] = d.get(ch, 0) + 1

这个是用 dict.get方法来统计 每个符号出现的次数。
dict.get 是这个意思。 以“ch“来作为key。 以0来作为默认值。 每次出现key为“ch“时都对应值加一。
为什么要统计它的次数,题目并不要求统计次数,而是找出来。这样应该是按顺序找出来即可。


QUOTE:
原帖由 limodou 于 2006-1-9 12:10 发表
为什么要统计它的次数,题目并不要求统计次数,而是找出来。这样应该是按顺序找出来即可。

呵呵,,既然是游戏,就just for fun吧。  次数最少哪几个肯定是我们要找的了。

我开始学python不久。老大以后请多多指教。
>次数最少哪几个肯定是我们要找的了。

这样是有问题的。因为题目要求是字母,如果某个字符也只是出现一次,那样的话不也被统计进去了嘛。而且还有可能出现相同的字母多次出现的情况。你这种做法,同一个字母出现多次的情况会变成只出现一次。再加上无法保证出现的次序。与题目要求不符啊。
呵呵,,我的逻辑没考虑 只能是字母。好像题目也没要必须是字母啊 (find rare characters in the mess below) 我想他这里的 characters  也没有要求必须是字母吧。
这个逻辑确实不能保证出现的顺序,  但次数统计还是准确的。  下面是我的输出。
In [6]: print d
{'\n': 1221, '!': 6079, '#': 6115, '%': 6104, '$': 6046, '&': 6043, ')': 6186, '(': 6154, '+': 6066, '*': 6034, '@': 6157, '[': 6108, ']': 6152, '_': 6112, '^': 6030, 'a': 1, 'e': 1, 'i': 1, 'l': 1, 'q': 1, 'u': 1, 't': 1, 'y': 1, '{': 6046, '}': 6105}

哈,,我还顺便知道了为什么按照我第一中方法会有这么多“n”了。

python语言真是灵活好玩,   谢谢老大前几帖中的指教,  以后希望能和你多多交流。
不过你说的的确对,要求是最小次数的字符,判断是字母的确是一个巧合。