2016-10-21 49 views
0

我寫了一個功能,但有些事情我無法弄清楚功能不添加項目到一個空表

def function(l1,l2): 
    list1 = [] 
    list2 = [] 
    for e1 in la: 
     for e2 in lb: 
      if e1 < e2: 
       list1.append(e1) 
      elif e2 < e1: 
       list2.append(e2) 
    l1[:] = list1 
    l2[:] = list2 

但這個功能讓我沒有輸出。

這個功能應該這樣的行爲:

function([1,2,3,4,5,6],[4,5,6,1,2,3]) 
l1 = [1,2,3] 
l2 = [1,2,3] 

我的老師告訴我,最後兩行的功能是必要的。

我已經試過返回兩個列表或打印它們,但我被告知該函數只需「修改」給定的列表。

+2

什麼是你的函數該怎麼辦? – sytech

+0

試圖修復縮進。希望沒有打破你的原始版本。 – Lafexlos

+1

你在definiton中有錯誤的名字 - 它在'def function(la,lb):'中必須是'la,lb'而不是'l1,l2'。你必須創建列表'l1','l2'(它們甚至可以是空的),然後再運行'function' – furas

回答

3

我想問題如下。您需要在調用函數之前將名稱分配給名稱,以便實際上具有對主範圍中的列表的引用。在你的例子中,你只需重新定義l1l2。試試這個:

l1 = [1,2,3] 
l2 = [1,2,3] 
function(l1, l2) 
0

我看到在你的代碼中的錯誤:

for e1 in la: 
for e2 in lb: 

我想這應該是:

for e1 in l1: 
for e2 in l2: 
1

你的函數的參數是L1和L2不拉和磅。你沒有提交任何退貨聲明。

def function(l1,l2): 
    list1 = [] 
    list2 = [] 
    for e1 in l1: 
    for e2 in l2: 
     if e1 < e2: 
      list1.append(e1) 
     elif e2 < e1: 
      list2.append(e2) 
    l1[:] = list1 
    l2[:] = list2 
    return l1,l2 

享受!

+0

謝謝,我是新人 – acacia

+0

它很酷的人;)。 –

1

目前尚不清楚你想做的事 - 有一個功能,打印或功能返回改變現有列表的功能。

如果你要打印,那麼你就錯過了:

print list1,list2 

末,而不是拷貝線([:]線)。如果你想改變給功能列表,比你做了什麼是好的:

l1[:]=list1 

到位更新列表,所以如果你這樣做:

l1=[1,2,3,4,5,6] 
l2=[4,5,6,1,2,3] 
function(l1,l2) 
print l1,l2 

你看到的結果。如果你不打印,你將看不到結果! 最後,你可以返回這樣的,而不是最後兩行:

return list1,list2 

,所以你可以:

print function(1,2,3,4,5,6],[4,5,6,1,2,3]) 

的第一個版本的問題:你在函數創建了兩個名單,但與他們沒有任何關係。在任何情況下,您都需要打印聲明來查看呼叫結果。

請注意您發佈了一些編碼錯誤,請檢查其他答案。

2

即使更正,您的功能也不會產生正確的輸出。問問自己:我考慮過多少次l2[0]?答案:len(l1)次!你想要做什麼是zip名單一起考慮每個列表的第一個元素在同一時間,那麼第二個,等

def keep_lesser(l1, l2): 
    la = [] 
    lb = [] 
    for a, b in zip(l1, l2): 
     if a < b: 
      la.append(a) 
     elif b < a: 
      lb.append(b) 
    l1[:] = la 
    l2[:] = lb 

此功能不返回任何東西,而是發生變異,或變更,這兩個清單作爲輸入傳遞給它。

編輯:使用示例

>>first = [1,2,3,4,5,6] 
>>second = [4,5,6,1,2,3] 
>>keep_lesser(first, second) <--note how this returns None 
>>print(first) 
[1, 2, 3] 
>>print(second) 
[1, 2, 3] 
+0

_「不會產生正確的輸出。」_ - 您的意思是_produce_? ;) –

+0

@leaf看起來像我甚至不能'產品'正確的句子 –

+0

那麼,只要你保持良好的代碼科曼',我很好。 –

1

正如其他的答案中指出要切換l1l2lalb,你應該通過兩個列表以前分配的,而不是列表文本的功能。

除此之外,你的函數沒有你所期望的,你應該通過列表循環使用如下的指標:

l1 = [1,2,3,4,5,6] 
l2 = [4,5,6,1,2,3] 
def function(l1,l2): 
    list1 = [] 
    list2 = [] 
    for i in range(len(l1)): 
     e1 = l1[i] 
     e2 = l2[i] 
     if e1 < e2: 
      list1.append(e1) 
     elif e2 < e1: 
      list2.append(e2) 
    l1[:] = list1 
    l2[:] = list2 

function(l1,l2) 
print l1,l2 

結果:

[1, 2, 3] [1, 2, 3] 
+0

爲什麼如果我wtrite – mewtire

+0

如果我寫函數(['capri','milano','genoa'],['roma','linate','torino' ]),爲什麼函數不會顯示修改的列表? – mewtire

+0

因爲你傳遞函數兩個列表文字,在函數退出後它們將被丟棄,因爲它們沒有綁定到任何變量。 爲了以後使用它們,你應該將它們分配給一個名字,就像我在答案中所示的 – eminescu