在python中复制列表

时间:2013-07-06 16:49:15

标签: python list function random

我对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]的修改。

我在这里做错了什么???

3 个答案:

答案 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))