2013-11-04 35 views
0
alphabet =["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"] 
def decoder(input): 
    inputlist = list(input) 
    inputlength = len(input) 
    alphabetlength = len(alphabet) 
    result = "Decoded Sentence: " 
    for x in range(inputlength): 
     for y in range(alphabetlength): 
      if inputlist[x] is alphabet[y]: 
       print ("hi") 
       if y == 24: 
        result += "a" 
       if y == 25: 
        result += "b" 
       else: 
        result += alphabet[y+2] 
      if inputlist[x] is "(": 
       result += "(" 
      if inputlist[x] is ")": 
       result += ")" 
      if inputlist[x] is ".": 
       result += "." 
      if inputlist[x] is " ": 
       result += " " 
    return result 

我的代碼應該由2.前遞增一個句子的字母:A-> C,1->ñ 我把打印(「HI」)語句檢查if語句是否被評估爲真,但它從來沒有。有人可以告訴我爲什麼嗎?爲什麼我的if語句不是比較列表項

+5

**'is' **用於身份檢查不平等,但這可能不是唯一的問題。 –

+0

爲了擴展上述內容,檢查它們是否是兩個內存中的相同對象和位置。你想用戶平等「==」不是。 – hankd

+1

Fyi,而不是做一個大量的字母表列表,「輸入字符串」,然後定義字母表爲「list(string.lowercase)'。 –

回答

5

is檢查對象身份。由於您似乎在測試兩個字符串是否具有相同的值(不是相同的對象),因此您最好通過==提供服務。例如:

if inputlist[x] == alphabet[y] 

您也可以對其他if語句進行相同的更新。

4

問題是is比較身份和字符串的不平等。兩個短字符串可能是相同的,因爲某些字符串正在進行CPython的操作,但您通常不應該基於此行爲。而是使用==來比較字符串的等於

注意,你可以這樣做了很多更好的使用str.translate,由str.maketrans創建的地圖:

>>> table = str.maketrans('abcdefghijklmopqrstuvwxyz', 'cdefghijklmopqrstuvwxyzab') 
>>> 'hello world'.translate(table) 
'jgooq yqtof' 

您可以進一步使用string.ascii_lowercase,這樣你就不需要自己鍵入字母;或將string.ascii_letters用於大小寫字符:

>>> table = str.maketrans(string.ascii_letters, string.ascii_letters[2:] + string.ascii_letters[:2]) 
>>> 'Hello World (This works!)'.translate(table) 
'Jgnnq Yqtnf (Vjku yqtmu!)' 
0

這可能有助於清除「is」關鍵字。 「是」檢查對象標識,而不是值。

var_1 = ('a', 'b') 
var_2 = ('a', 'b') # same content, but different object 
var_3 = var_1 # same object 
n = lambda v: ' ' if v else ' not ' 
print('{0} has{2}the same value as {1}'.format('var_1', 'var_2', n(var_1 == var_2))) 
print('{0} has{2}the same value as {1}'.format('var_2', 'var_3', n(var_2 == var_3))) 
print('{0} has{2}the same value as {1}'.format('var_3', 'var_1', n(var_3 == var_1))) 
print('{0} is{2}the same object as {1}'.format('var_1', 'var_2', n(var_1 is var_2))) 
print('{0} is{2}the same object as {1}'.format('var_2', 'var_3', n(var_2 is var_3))) 
print('{0} is{2}the same object as {1}'.format('var_3', 'var_1', n(var_3 is var_1))) 

輸出:

var_1 has the same value as var_2 
var_2 has the same value as var_3 
var_3 has the same value as var_1 
var_1 is not the same object as var_2 
var_2 is not the same object as var_3 
var_3 is the same object as var_1 

所以,所有三個具有相同的值,但是隻有1和3是相同的。

+2

不,['is'](http://docs.python.org/2/reference/expressions.html#is)不檢查內存地址;它檢查對象標識。 CPython實現恰好通過比較兩個C指針來判斷它們是否指向相同的地址,但是其他實現(如Jython和PyPy)卻沒有(事實上也不可以_couldn't_,因爲它們是用語言編寫的沒有指針或地址)。 – abarnert

+0

很好的解釋。我沒有考慮過Jython或PyPy。 – jgranger

+0

@JeremyGranger那麼,你爲什麼不糾正你的答案?它可能讓你擺脫那個-1甚至獲得一些+1 ... – glglgl

1

除了is薄的,你有一個問題在你的代碼:

只要y == 24,這將打破:一是a將被添加,然後alphabet[26] - 這會導致錯誤。

所以你的邏輯改變

for inp in inputlist: 
    if inp in "(). ": 
     result += inp 
    else: # very important 
     for y in range(alphabetlength): 
      if inp == alphabet[y]: 
       if y == 24: 
        result += "a" 
       elif y == 25: # elif instead of if! 
        result += "b" 
       else: 
        result += alphabet[y+2] 

這甚至可以進一步提高:

如果您alphabet = 'abcdefghijklmnopqrstuvwxyz',你可以做

for inp in inputlist: 
    if inp in "(). ": 
     result += inp 
    else: # very important 
     idx = alphabet.find(inp) 
     if idx >= 0: # found 
      result += alphabet[(idx + 2) % len(alphabet)]