2016-06-08 88 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