2013-11-20 102 views
2

我是python的新手,所以我可能使用了不正確的術語,但是如何「壓縮」這段代碼?我怎樣才能「壓縮」這段代碼?

  for i in self.letterWord[0:1]: 
        if i == letter: 
          self.binaryWord[0] = 1 

      for i in self.letterWord[1:2]: 
        if i == letter: 
          self.binaryWord[1] = 1 

      for i in self.letterWord[2:3]: 
        if i == letter: 
          self.binaryWord[2] = 1 

它看起來像這樣嗎?

  for i in self.letterWord[i:i+1]: 
        if i == letter: 
          self.binaryWord[i]=1 

我嘗試使用上面的代碼,但它口口聲聲說

local variable 'i' referenced before assignment 

然後,當我在global i型,它說

global name 'i' not defined 

嘿,夥計們!感謝所有的迴應!對不起,模糊的信息,謝謝你回答我的問題。

+0

使用四個空格進行縮進。 – 2013-11-20 14:44:06

+0

告訴我,在這個表達中'i'的價值是什麼?因爲我在self.letterWord [i:i + 1]'? – StoryTeller

+3

你想完成什麼? – Tyler

回答

2

for i in self.letterWord[i:i+1]: 
    if i == letter: 
     self.binaryWord[i]=1 

的問題是,i需求要查找之前評估self.letterWord[i:i+1]i被用作列表迭代器,所以這是錯誤的來源。

嘗試這樣:

for i, ltr in enumerate(self.letterWord): 
    if ltr == letter: 
     self.binaryWord[i] = 1 

甚至更​​好

self.binaryWord = [ 1 if ltr == letter else 0 for ltr in self.letterWord ] 
1

與您現有的安裝工作,純粹是爲了凝聚的代碼,你可以這樣做:

for idx, val in enumerate(self.letterWord[:3]): 
    if val == letter: 
     self.binaryWord[idx] = 1 

雖然這是可能的,你可以用其他的方法來構建這些對象,如列表譜曲/荏苒在一起/等等......

1

首先,(如果可能的話,在一行代碼來創建self.binaryWord),您建議的代碼使用i意思兩個不同的東西。如果有的話,那就是:

for l in self.letterWord[i:i+1]: 
     if l == letter: 
      self.binaryWord[i]=1 

而且,self.letterWord [0:1]將只包含一個項目:self.letterWord [0]。或者,如果超出範圍,則一無所獲。所以你根本不需要這些for循環。

if len(self.letterWord) < i and self.letterWord[i] == letter: 
     self.binaryWord[i] = 1 

您改變它使用i作爲索引;這是否意味着有一個外部循環?如果你正在循環閱讀letterWord,你不需要我添加的len檢查。

for i in range(len(self.letterWord)): 
    if self.letterWord[i] == letter: 
     self.binaryWord[i] = 1 

此外,遍歷列表的指標是不是最佳做法,使用enumerate如果您需要的指數。

for i, l in enumerate(self.letterWord): 
    if l == letter: 
     self.binaryWord[i] = 1 

如果你剛纔創建binaryWord(你不展示它是如何創建的),你可以只創建一個列表理解:

self.binaryWord = [int(l == letter) for l in self.letterWord] 
# int(True) is 1, int(False) is 0 
1

一行解決

self.binaryWord = "%s%s" % (self.binaryWord[:3].replace(letter, "1"), self.binaryWord[3:]) 

如果你想改變行中的所有字母,你可以做somethinf這樣

self.binaryWord = self.binaryWord.replace(letter, "1") 
相關問題