【问题标题】:reverse order of pythonpython的逆序
【发布时间】:2013-09-25 08:42:03
【问题描述】:

我坚持以下实验室练习:

我们需要的第一个部分是一个例程,给出一个词,将 以某种方式将除了第一个和最后一个之外的所有顺序都打乱了 人物。而不是随机移动我们周围的角色 将颠倒字母的顺序。下面的代码实现 这个:

def jumble(x):
    return x[len(x)::-1]
my_string="Alistair"
print(" Reverse ",jumble(my_string))

将上面的代码复制到一个文件中并运行它。目前,它扭转了 “my_string”中所有字符的顺序。修改代码,使 单词的第一个和最后一个字母不颠倒。那是, 而不是产生"riatsilA",而是产生"Aiatsilr"

这是我上面部分的代码:

def jumble(x):
    temp0=x[0]
    temp_last=x[-1]
    x_new=temp0 + x[-2:0:-1] + temp_last
    return x_new
my_string="Alistair"
print(" Reverse ",jumble(my_string))

上述例程不考虑前导或尾随白色 空格、标点符号或其他可能合法构成的字符 字符串,但不应混淆。为了 例如,如果字符串是" Alistair, ",结果应该是 " riatsilA, ". 修改你的例程,使只有第一个连续的 一系列字母字符(减去第一个和最后一个 字符)被颠倒。确保最终返回的字符串 包括所有其他前导和尾随字符。

我不知道该怎么做,因为空格和标点符号可以在任何地方发生,我正在考虑有两个列表,一个用于空格和标点符号,另一个用于“连续的字母字符系列”,使用 append 方法将元素附加到每个列表,但不确定如何保留索引。有人可以帮我吗?提前致谢。

【问题讨论】:

  • 你问题的措辞让人不清楚你自己做了哪些部分,以及你刚刚从作业中逐字复制了什么。
  • 您的作业示例代码过于复杂; x[::-1] 足以反转一个字符串。
  • @BenjaminBannier 嗨,我的问题在最后两段。

标签: python string reverse


【解决方案1】:
#!/usr/bin/env python
#-*-coding:utf-8-*-
import re

def reverse(s):
    p = re.compile(r'\w+')
    for m in p.finditer(s):
        word = m.group()
        if word:
            p = s.partition(word)
            l = list(p)
            index = p.index(word)
            l[index] = l[index][::-1]
            l2 = list(l[index])
            l2[0],l2[-1]=l2[-1],l2[0]
            l[index]=''.join(l2)
            s = ''.join(l)
    return s

s="Alistair Chris,"
print reverse(s)

修复它。

【讨论】:

  • 不适用于“Alistair”作为输入。输出是“Alistair,”而不是“riatsilA,”
  • 仍然无法正常工作 ;-) 只需尝试使用“Alistair”并检查输出。
  • s=" Alistair Chris, " print "%s" % reverse(s) #output: Aiatsilr Cirhs,
【解决方案2】:

以下代码片段可能会帮助您完成最后一项任务。 如果在字符串开头或结尾之外的其他地方发现了特殊字符,则无需特殊处理来恢复子集。

# Special chars which should be ignored for reverting
SPECIALCHARS = [' ', '.', ',']

def reverse( string_ ):
    # Find occurence of 'special' chars. Stack position and char into a list.
    specchar = [( i, ltr ) for i, ltr in enumerate( string_ ) if ltr in SPECIALCHARS]
    if specchar:
        # Remove all the special characters
        newstring = ''.join( c for c in string_ if c not in SPECIALCHARS )
        # Reverse the legal characters
        newstring = newstring[::-1]
        offset = 0
        # Re-insert the removed special chars
        for pos, char in specchar:
            if pos + 1 + offset >= len( newstring ):
                # Append at the end
                newstring += char
            else:
                # Insert
                newstring = newstring[:pos + offset] + char + newstring[pos + offset:]
                offset += 1
        return newstring
    else:  # No special char at all, so just revert
        return string_[::-1]


print " '%s' =?= ' riatsilA, '" % ( reverse( " Alistair, " ) )

将导致以下输出:' riatsilA, ' =?= ' riatsilA, '

忽略第一个和最后一个字符进行还原是单行。 使用这个来反转“中间”: t[1:-1][::-1] 然后添加第一个和最后一个字符。

>>> t = "Alistair"
>>> t[0]+t[1:-1][::-1]+t[-1] 
'Aiatsilr'

编辑

好的,现在我想我明白你想要什么了 :-)

newstr = ""
fullstr = ""
for char in mystr:
    if char in SPECIALCHARS:
        if len( newstr ): # Is already something to invert there?
            #Ignore 1st and last char and revert the rest
            newstr = newstr[0] + newstr[1:-1][::-1] + newstr[-1]
            fullstr += newstr + char
        else: # Special char found but nothing to revert so far
            fullstr += char
        newstr = ""
    else: # No special char so just append
        newstr += char
print "'%s'" % fullstr

【讨论】:

  • 感谢您的代码,但这似乎不是我想要的。我想保持空白不变,只是反转所有非开始和非结束特征,例如“Alistair Chris”应该改为“Aiatsilr Cirhs”
  • @Bob 请看一下最后的编辑。如果我的理解正确,应该是这个。
猜你喜欢
  • 1970-01-01
  • 2010-09-17
  • 2013-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-06
  • 1970-01-01
相关资源
最近更新 更多