2012-03-16 36 views
0

問題:請勿在您的函數中使用set:使用列表返回第一個和最後一個名稱中的常見字母列表(交叉點)提示用戶名字和姓氏,並以名字和姓氏作爲參數來調用函數並打印返回的列表。Python函數返回第一個和最後一個名字中的常見字母列表

我不明白爲什麼我的程序只是打印「不匹配」,即使有字母匹配。任何幫助!謝謝一堆!

到目前爲止的代碼:

import string 

def getCommonLetters(text1, text2): 
""" Take two strings and return a list of letters common to 
    both strings.""" 
    text1List = text1.split() 
    text2List = text2.split() 
    for i in range(0, len(text1List)): 
     text1List[i] = getCleanText(text1List[i]) 
    for i in range(0, len(text2List)): 
     text2List[i] = getCleanText(text2List[i]) 

    outList = [] 
    for letter in text1List: 
     if letter in text2List and letter not in outList: 
      outList.append(letter) 
    return outList 

def getCleanText(text): 
"""Return letter in lower case stripped of whitespace and 
punctuation characters""" 
    text = text.lower() 

    badCharacters = string.whitespace + string.punctuation 
    for character in badCharacters: 
     text = text.replace(character, "") 
    return text 

userText1 = raw_input("Enter your first name: ") 
userText2 = raw_input("Enter your last name: ") 
result  = getCommonLetters(userText1, userText2) 
numMatches = len(result) 
if numMatches == 0: 
    print "No matches." 
else: 
    print "Number of matches:", numMatches 

for letter in result: 
    print letter 
+0

的問題似乎是你Python語法... – JBernardo 2012-03-16 20:36:52

回答

2

試試這個:

def CommonLetters(s1, s2): 
    l1=list(''.join(s1.split())) 
    l2=list(''.join(s2.split())) 
    return [x for x in l1 if x in l2] 

print CommonLetters('Tom','Dom de Tommaso')  

輸出:

>>> ['T', 'o', 'm'] 
+0

非常感謝你!這實際上救了我。我一直在解決這個問題幾個小時。 – user1210588 2012-03-16 19:30:23

+2

沒有必要將字符串轉換爲列表。字符串已經可迭代了。我甚至會跳過分裂,因爲這不會刪除標點符號,所以您仍然需要單獨的過濾步驟。只是'def common_letters(s1,s2):如果s2中的x'返回[x對於s1中的x]'就是這樣做的。 – agf 2012-03-16 20:18:05

+0

@Jernardo在問題中沒有指定'set's。 – agf 2012-03-16 20:36:08

3
for letter in text1List: 

這是你的問題。 text1List是列表,而不是字符串。你迭代一個字符串列表(例如['Bobby','Tables']),然後檢查'Bobby'是否在列表text2List中。

你想迭代你的字符串text1的每個字符,並檢查它是否存在於字符串text2中。

你的代碼中有一些非pythonic成語,但你會及時瞭解到。

後續行動:如果我用小寫字母輸入我的名字,用大寫字母輸入我的名字,會發生什麼?你的代碼會找到任何匹配嗎?

+0

感謝編寫Java!這幫助我指出了正確的方向。 – user1210588 2012-03-16 19:30:42

1

此前set()是重複去除常見的成語在Python 2.5,你可以使用一個列表的轉換到字典中刪除重複。

下面是一個例子:

def CommonLetters(s1, s2): 
    d={} 
    for l in s1: 
     if l in s2 and l.isalpha(): 
      d[l]=d.get(l,0)+1 
    return d        

print CommonLetters('matteo', 'dom de tommaso') 

這將打印像這樣常見的字母數:

{'a': 1, 'e': 1, 'm': 1, 't': 2, 'o': 1} 

如果你想擁有的那些常用字母列表,只需要使用鑰匙字典的()方法:

print CommonLetters('matteo', 'dom de tommaso').keys() 

哪個打印只是鍵:

['a', 'e', 'm', 't', 'o'] 

如果你想大小寫字母相匹配,邏輯添加到該行:

if l in s2 and l.isalpha(): 
相關問題