【问题标题】:Python mirrored string functionPython镜像字符串函数
【发布时间】:2013-11-04 03:01:33
【问题描述】:

我正在尝试开发一个函数mirror(),它接受一个字符串并返回其镜像字符串,但前提是镜像字符串可以使用给定字符串中的“镜像”字母表示。

例如,

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

也就是说,镜像的bd。字母 e 没有任何镜像等效项。

到目前为止,我已经开始这样做了

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

如何扩展它以适用于整个单词?

【问题讨论】:

  • 你有什么问题?
  • 创建镜像时无效的字母列表。检查反转字符串中的每个字母以查看它是否在无效列表中:对于 reverseString 中的字母:如果字母无效:返回“无效”。我认为时间复杂度是 O(n)。
  • “木头”的镜像不应该是boow
  • @Christian '木头'的镜子实际上是弓!

标签: python string python-3.x


【解决方案1】:

首先,你应该有一个字典来存储每个字符的镜像。

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

您使用的反向字符串方法是正确的。只需添加上面的检查,您就可以生成镜像字符串了!

另一种方法是使用简单的 Python hack for...else

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

【讨论】:

  • 我建议在这里使用for...else 结构。它消除了对valid 标志的需要。见docs.python.org/3.3/tutorial/…
  • 不错的建议。不过,for...else 的结构并不那么直观,而且有时令人困惑。但是,因人而异。谢谢。
  • @SimonT 希望你明白为什么dict.get() 会出错。 :)
  • 是的,我看错了代码。 dict.get 不会是正确的,因为有些字母故意不匹配。
  • 谢谢阿什!使用字典实际上是我首先应该做的。成功了!
【解决方案2】:

您可以在迭代字符串时(反向)在生成器表达式中查找替换字符。您可以使用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"

【讨论】:

    【解决方案3】:

    您对以相反顺序遍历给定字母有正确的想法。但是,您不一定只将每个字母本身作为其自己的镜像版本。例如bd,它们是彼此的镜像版本。

    如果您正在学习编程,最简单的方法是使用for 循环在给定字母之间向后移动,并对每个字母使用一些if 语句来确定镜像字母(如果有)。

    【讨论】:

      【解决方案4】:

      试试这个:

      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判断strs中的chars是否有效。

      【讨论】:

        【解决方案5】:
        def mirror(lst):
          return lst + lst[-2::-1]
        
        print(mirror([0, 2, 4, 6]))
        

        【讨论】:

        • 这输出[0, 2, 4, 6, 4, 2, 0],但是OP想要的是找到一个字符串,其字形序列是传入字符串的字形序列的图形镜像(使用问题中实际上没有提到的一些合理的默认字体)。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-07-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-15
        • 2017-05-05
        相关资源
        最近更新 更多