我对Python比较陌生。 我试图找到一个函数,它接受一个列表,在该列表中随机添加+1值,然后将带有修改值的新列表作为新索引。
例如,如果我有
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 :(得分: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[:]
,如我的评论中所述。这更具可读性。答案 1 :(得分: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
答案 2 :(得分: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))