3

我对 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]的修改,当每个索引列表应该是前一个索引列表的修改时。

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

4

3 回答 3

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[:],如我的评论中所述。这更具可读性。
于 2013-07-06T17:03:12.560 回答
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
于 2013-07-06T16:53:46.027 回答
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))
于 2013-07-06T17:40:41.770 回答