2013-07-06 48 views
3

我對Python比較陌生。 我想拿出一個函數,該函數接受一個列表,在該列表中隨機添加+1值,然後將修改後的值作爲新索引放入一個新列表。在python中複製列表

舉例來說,如果我有

blank=[] 
list_one=[1,2,3,4,5] # 

可能的結果可能是

blank=[ [1,2,3,4,5], [1,3,3,4,5],[1,3,3,4,6],[2,3,3,4,6],[2,4,3,4,6] ] 

那麼該功能將空白[0],複製並修改它,並將它作爲空白[1 ]。類似地,函數採用坯件[1],其複製和修改它,並將其返回作爲空白[2]

這是我的代碼:

import random 
list_one=[1,2,3,4,5] 
def new_function(value): 
    for i in range(1,value): 
     list_copy=list_one[:] 
     blank.append(list_copy) 
     x=random.choice(blank[i]) 
     y=blank[i].index(x) 
     blank[i][y]=x+1 
    return blank 

print new_function(4) 
"""Yields [ [1,2,3,4,5],[1,3,3,4,5],[2,2,3,4,5],[1,2,4,4,5] ] 
    (this is the list, blank)""" 

我的問題是,空白[1],空白[2]和空白[3]都是空白[0]的修改,當每個索引列表應該是前一個索引列表的修改。

我在做什麼錯在這裏?

+0

作爲一個說明,我已經使用'列表(SEQ)'複製列表好得多總是發現讀取比'seq [:]'。後者對於新用戶可能有點神祕,並且它們是相同的。 –

+0

好的,謝謝你的信息。但是爲什麼我的函數只是在第一個列表中創建空白的修改副本? –

+0

空白[1]必須是空白[0]的修改後的副本,空白[2]必須是空白[1]的修改後的副本,依此類推。但我的功能只是每次複製空白[0]並隨機修改一個值 –

回答

2

你從1開始你的範圍,它們應該從0開始,而且你總是從list_one複製並且永遠不會更新它,因此它們都是原始列表的副本,而不是以前修改過的,這裏是固定的代碼

import random 
list_one=[1,2,3,4,5] 
blank = [] 
def new_function(value): 
    global list_one 
    for i in range(value): 
     list_copy = list_one[:] 
     blank.append(list_copy) 
     x=random.choice(blank[i]) 
     y=blank[i].index(x) 
     blank[i][y]=x+1 
     list_one = list_copy 
    return blank 
print new_function(4) 

這給了我的

[[2, 2, 3, 4, 5], [3, 2, 3, 4, 5], [3, 2, 3, 4, 6], [3, 2, 3, 5, 6]] 

,你的描述相匹配的隨機輸出。

此外,不是從列表中選擇一個元素,而是爲什麼不選擇一個隨機索引,然後修改它?

def new_function(value): 
    global list_one 
    for i in range(value): 
     list_copy=list_one[:] 
     blank.append(list_copy) 
     x=random.randrange(len(list_copy)) 
     blank[i][x] += 1 
     list_one = list_copy 
    return blank 
4

問題是您總是複製原始列表,而不是新的。這很容易通過使用相同的名稱爲新的列表,從而解決了,當環路前來再次,新的名單被複制:

import random 

def randomly_increment(seq, n): 
    for _ in range(n): 
     x = random.randrange(len(seq)) 
     seq = list(seq) 
     seq[x] += 1 
     yield seq 

我相信這作品像預期一樣:

>>> list(randomly_increment([1, 2, 3, 4, 5], 4)) 
[[1, 2, 4, 4, 5], [1, 2, 4, 5, 5], [1, 2, 4, 5, 6], [1, 2, 4, 6, 6]] 

其他變化:

  • 而不是建立一個列表,這是一個生成器,它通常更靈活,更容易讀/寫。如果你需要一個列表,然後按照上面的list()打電話。
  • 不是隨意選擇,而是發現它是改變它的地方,選擇一個地方並改變它更有意義。這也避免了seq.index()將返回與給定值相匹配的第一個值的問題,不一定是「拾取的」值。
  • 使用list(seq)複製seq[:],如我的評論中所述。這更可讀。
+0

哦,好吧,我明白了。我想這畢竟是我的問題! 並感謝您的幫助! –

+0

@AshwiniChaudhary這是更好,編輯。 –

0

要確保每次複製的清單,我會去是這樣的:

from random import choice 
list_one=[1,2,3,4,5] 

def new_function(value): 

    blank=[] 
    blank.append(list_one) 

    new_list = [] 

    for i in range(value): 
     new_list = new_list[:] if new_list else list_one[:] 
     new_list[choice(new_list)] += 1 
     blank.append(new_list) 
    return blank 

print (new_function(4)) 
+0

嗨,感謝您的信息。我的解釋器說,'列表'對象沒有'複製'屬性 –

+0

我正在運行Python 3.3,無論如何我糾正了片段使用列表片。 –