蟒蛇

2013-09-25 190 views
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, ".修改你的常规,使得只有第一连续 一系列字母字符(减去第一个和最后 字符)是相反的。确保最终返回的字符串 包含所有其他前导字符和尾随字符。

我不知道如何做到这一点,如空格和标点可以发生在任何地方,我想有两个列表,一个空的空间和标点,而另一个用于“contigous系列的字母字符”使用append方法将元素附加到每个列表,但不知道如何保留索引。有人可以帮我吗?提前致谢。

+0

你的问题的措辞使得它不清楚你做你自己哪些部分和你刚刚从你的任务中复制的内容。 –

+1

您的作业示例代码已结束复杂的事情; 'x [:: - 1]'足以反转一个字符串。 –

+0

@BenjaminBannier嗨,我的问题是在最后两段。 – Bob

回答

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) 

固定它。

+0

不适用于“Alistair”作为输入。输出是“Alistair”,而不是“riatsilA”, –

+0

仍然不能正常工作;-)只需尝试“Alistair”,然后检查输出。 –

+0

修复它,检查它。 – sinceq

0

以下代码snipplet可能会帮助您完成上一个任务。 如果在字符串的开始或结尾处找到一个特殊的字符,那么没有特殊的处理来恢复子集。

# 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 
+0

thx代表您的代码,但它看起来不完全是我想要的。我想保持空白不变,只是将所有非开始和非结束特征颠倒过来,例如“Alistair Chris”应改为“Aiatsilr Cirhs”, – Bob

+0

@Bob请看看最后的编辑。如果我理解你是正确的,这应该是一个。 –