2016-06-08 63 views
0

这可能很简单,但我无法发现我犯的错误。Python - 代码中的错误

我写了一个简单的程序来读取wordfile中的单词(不一定是字典单词),总结这些字符并将它们从最低到最高打印出来。 (PART1)

然后,我在这个程序后面写了一个小脚本来过滤和搜索只有那些只有字母,字符的单词。 (PART2)

第一部分正常工作时,第二部分不打印任何东西。我认为错误发生在'print ch'这一行,列表中的一个字符被转换为字符串没有被打印出来。请指教一下可能是错误

#!/usr/bin/python 

# compares two words and checks if word1 has smaller sum of chars than word2 
def cmp_words(word_with_sum1,word_with_sum2): 
    (word1_sum,__)=word_with_sum1 
    (word2_sum,__)=word_with_sum2 
    return word1_sum.__cmp__(word2_sum) 

# PART1 
word_data=[] 
with open('smalllist.txt') as f: 
    for l in f: 
     word=l.strip() 
     word_sum=sum(map(ord,(list(word)))) 
     word_data.append((word_sum,word)) 

word_data.sort(cmp_words) 

for index,each_word_data in enumerate(word_data): 
    (word_sum,word)=each_word_data 

#PART2 
# we only display words that contain alphabetic characters and numebrs 
valid_characters=[chr(ord('A')+x) for x in range(0,26)] + [x for x in range(0,10)] 

# returns true if only alphabetic characters found 
def only_alphabetic(word_with_sum): 
    (__,single_word)=word_with_sum 

    map(single_word.charAt,range(0,len(single_word))) 

    for ch in list(single_word): 
     print ch # problem might be in this loop -- can't see ch 
     if not ch in valid_characters: 
      return False 
    return True 

valid_words=filter(only_alphabetic,word_data) 
for w in valid_words: 
    print w 

由于提前,

约翰

+1

仅供参考,使用'cmp'功能的不赞成使用“键”功能进行排序,速度较慢,且不那么直观。您可以完全删除'cmp_words',为'from operator import itemgetter'添加一个导入并将'word_data.sort(cmp_words)'改为'word_data.sort(key = itemgetter(0))'以获得相同的结果,并且更快。另外,'str'是它们字符的迭代器,你不需要用'list'来包装它们,所以,例如,sum(map(ord,(list(word))))'可以简化为'sum(map(ord,word))'或者更为有效,如果不那么明显,在Py2中你可以做'sum(bytearray(word))'。 – ShadowRanger

回答

1

的问题是,charAt不存在蟒蛇。

您可以直接使用:'for ch in my_word`。

注:

  1. 可以使用内置str.isalnum()为你测试

  2. valid_characters只包含字母的大写版本

+1

在这种情况下不应该引发NameError吗?在我的系统(python 2.7)上抛出 – syntonym

+0

它抛出 AttributeError:'str'对象没有属性'charAt' – valentin

+0

NameError是用于未定义变量的情况 – valentin