蟒蛇

2013-09-25 224 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請看看最後的編輯。如果我理解你是正確的,這應該是一個。 –