2013-11-04 73 views
1

我想開發一個函數mirror(),它接受一個字符串並返回它的鏡像字符串,但前提是鏡像字符串可以用給定字符串中的「鏡像」字母表示。Python鏡像字符串函數

例如,

>>>mirror('vow') 
'wov' 
>>>mirror('wood') 
'boow' 
>>>mirror('bed') 
'INVALID' 

即,鏡像bd。字母e沒有任何鏡像等效項。

到目前爲止,我已經開始使用此

def mirror(s): 
    return str[::-1] 

如何延長這爲整個單詞的工作?

+8

你的問題是什麼? –

+0

創建鏡像時無效的字母列表。檢查反向字符串中的每個字母以查看它是否在無效列表中:對於reverseString中的字母:如果字母無效:返回'無效'。我認爲時間複雜性將是O(n)。 – LiavK

+1

'木'的鏡子不應該'boow'? – Christian

回答

3

首先,你應該有一個存儲每個字符的鏡像的字典。

mirrored = {'b': 'd', 'd': 'b', 'v': 'v', ...} 

因此,對於每一個我們需要製作的鏡像字符串,你應該檢查給出的字符串中的每個角色都有它的鏡像字符串本身的價值。

given_string = input() 
valid = True 
for char in given_string: 
    if not mirrored[char] in given_string: 
     valid = False 
     break 
if valid: 
    # generate mirrored string 

您使用的反轉字符串方法是正確的。只需添加上面的檢查&,您將可以生成鏡像字符串!

另一種方式來做到這一點,將使用for一個簡單的Python黑客... else

given_string = input() 
valid = True 
for char in given_string: 
    if not mirrored[char] in given_string: 
     break 
else: 
    # generate mirrored string 
+1

我建議在這裏使用'for' ...'else'結構。它消除了對「有效」標誌的需求。請參閱http://docs.python.org/3.3/tutorial/controlflow.html#break-and-continue-statements-and-else-clauses-on-loops – SimonT

+1

不錯的建議。儘管如此,「其他」結構的設計並不那麼直觀,而且有時令人困惑。但是,它因人而異。謝謝。 –

+0

@SimonT希望你明白爲什麼'dict.get()'會出錯。 :) –

0

你有正確的想法,以相反的順序遍歷給定的字母。但是,您不一定要將每個字母本身作爲自己的鏡像版本。一個例子是bd,它們是彼此的鏡像版本。

如果你正在學習編程將使用for循環,通過給定的字母向後移動,並使用一些if語句每個字母確定鏡像信(如果有的話)的最簡單方法。

+0

謝謝,非常好說! –

1

您可以查找替換字符發生器表達你遍歷字符串(反向)。您可以用str.join將字符重組爲字符串。我建議使用「比請求更容易請求寬恕」成語來處理無效字符(如果字符有效,請不要檢查前端,但如果不是,則使用trycatch語句處理異常。

def mirror(s): 
    mir={'b':'d','d':'b','o':'o','p':'q','q':'p','v':'v','w':'w','x':'x'} 
    try: 
     return "".join(mir[c] for c in reversed(s)) 
    except KeyError: 
     return "INVALID" 
0

試試這個:

def mirror(s): 
    mir = {'b': 'd', 'd': 'b', 'o': 'o', 'p': 'q', 
      'q': 'p', 'v': 'v', 'w': 'w', 'x': 'x'} 
    if not set(s).issubset(mir.keys()): 
     return 'INVALID' 
    return ''.join(map(lambda x: mir[x], s[::-1])) 

這裏使用set判斷str中s的字符是否有效。