2016-09-09 45 views
-3

我使用python 2.7,我想減少和優化此代碼行,但我有一個問題,有人可以幫助我嗎?Python的錯誤,當我嘗試優化這些代碼行

我有這個名單B = [[0, Act1, XX1, u'P-Um'],.....[0, Act100, ZZ30, u'D- MOM']]

  1. 我想只拿從B第4個值
  2. 只需花費一部分連字符後,有時它是
  3. 帶回到B的空間

現在我寫這個代碼

for i in range(len(B)): 
     x.append(B[i][3]) 
     A = [i.split('-',1)[1] for i in x] 
     #A=[u'Um', u' LY', u' NO', ......, u' MOM']    
    for i in range(len(B)): 
     A[i].lstrip() 
     p = [] 
     for i in range(len(B)): 
      p.append(A[i].lstrip()) 
     for i in range(len(B)): 
      B[i][3] = p[i] 

當我試圖縮短它時,我有兩個錯誤。

#Short version 

for i in range(len(B)): 
     x.append(B[i][3]) 
     A = [i.split('-',1)[1], x] #Error:AttributeError: 'int' object has no   attribute 'split' 
     B[i][3].append(A[i].lstrip()) #Error:AttributeError: 'unicode' object has no attribute 'append' 

我嘗試了很多方法來解決錯誤,但仍然無法正常工作。你能幫忙嗎?你認爲是否有可能使上半部分沒有錯誤?

非常感謝您提前。

+1

停止,你總是覆蓋其值 – RafaelC

+0

此代碼是有點難以明白由於使用一個字母變量名稱。最好使用變量的描述性名稱(通常)。 –

+0

你的列表甚至不工作:有變量,整數和字符串...那麼,你正在分割一個由'range'返回的索引:沒辦法,那麼你將追加到你的一個unicode列表對象:沒有辦法......不清楚...... –

回答

0

您可以使用列表理解:

B=[[B_element[0],B_element[1],B_element[2],B_element[3].split('-',1)[1].lstrip()] for B_element in B] 
0

我沒有看到你已經嘗試了很多方法,但你的代碼確實有失誤了一把。即使在糾正縮進錯誤之後,您的第一個變體會迭代您不需要四次的索引,並且每次刪除兩個條目(僅在第二次使用結果時)。第二個版本首先失敗,因爲該索引不是條目,其次是因爲您試圖更改字符串而不是替換它。

A=[] 
x=[] 
for Bi in B: 
    Bi3 = Bi[3] 
    part = Bi3.split('-',1)[1].lstrip() 
    x.append(Bi3)  # Original B[i][3] data 
    A.append(part)  # What is this for? 
    Bi[3] = part  # replaces B[i][3] 

如果你確實需要的性能,它很可能是一個正則表達式可能比分割/條組合更有效地提取部分,因爲這些功能爲每次調用創建新的字符串。

0

您不必索引B的項目來遍歷它們。這可能有幫助。

>>> Act1 = XX1 = Act100 = ZZ30 = None # simply to avoid NameError exceptions 
>>> B = [[0, Act1, XX1, u'P-Um'],[0, Act100, ZZ30, u'D- MOM']] 
>>> result = [b[3].split('-')[1].strip() for b in B] 
>>> result 
['Um', 'MOM'] 

result是一個列表,通過在乙取元件3的每個項目,放在'-'分裂,並從分割字符串的元件1剝離前導和結尾間隔產生的。我使用的技術被稱爲list comprehension

如果您想用這些新值替換第四個元素,實現此目的的一種方法如下。

>>> final = [] 
>>> for b, r in zip(B, result): 
...  final.append([b[0], b[1], b[2], r]) 
... 
>>> final 
[[0, None, None, 'Um'], [0, None, None, 'MOM']] 

然後只是final替換B:使用嵌套循環時使用`i`作爲變量的名稱

>>> B = final