2013-11-04 118 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的字符是否有效。