0

我坚持以下实验室练习:

我们需要的第一部分是一个例程,给定一个单词,它会以某种方式打乱除第一个和最后一个字符之外的所有字符的顺序。我们将颠倒字母的顺序,而不是只是随机移动字符。下面的代码实现了这一点:

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 方法附加元素到每个列表,但不确定如何保存索引。有人可以帮我吗?提前致谢。

4

2 回答 2

0
#!/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)

解决它。

于 2013-09-25T09:03:07.337 回答
0

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

# 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
于 2013-09-25T10:25:50.827 回答