附加到第3个订单列表不按预期工作[重复]

问题描述 投票:0回答:1

这个问题在这里已有答案:

我有一些代码需要n组状态,然后通过随机交换组之间的状态创建多个“邻居”。

from random import randint as rand

groups = [['VT', 'TX', 'HI', 'AR', 'PA', 'OK', 'AK', 'MI', 'ND', 'ID', 'NY', 'WV', 'FL', 'UT'],
          ['MO', 'MA', 'SD', 'NE', 'GA', 'MN', 'SC', 'CA', 'RI', 'AZ', 'NH', 'MS', 'AL', 'WI', 'GU', 'CT', 'MT', 'TN', 'OH', 'OR', 'IA'],
          ['NV', 'KY', 'NM', 'KS', 'IN', 'LA', 'DE', 'MD', 'CO', 'IL', 'VA', 'NC', 'WY', 'NJ', 'WA', 'ME']]

def hill_climb_nbr(groups,nbr_size):
    #swap one state in and out of each group

    group_list = []

    for g in range(0,nbr_size):

        temp_val = []

        groups_copy = groups

        for i in range(0,len(groups)):
            rand_num = rand(0,len(groups[i])-1)
            temp_val.append(groups[i][rand_num])
            groups_copy[i].pop(rand_num)
            print(rand_num)

        for j in range(0,len(temp_val)):
            groups_copy[j].append(temp_val[j-1])

        print(groups_copy)
        print('group_list')

        group_list.append(groups_copy)

        print(group_list)

    return group_list

hill_climb_nbr(groups,3)

以下是输入示例:

[['VT', 'TX', 'HI', 'AR', 'PA', 'OK', 'AK', 'MI', 'ND', 'ID', 'NY', 'WV', 'FL', 'UT'],
 ['MO', 'MA', 'SD', 'NE', 'GA', 'MN', 'SC', 'CA', 'RI', 'AZ', 'NH', 'MS', 'AL', 'WI', 'GU', 'CT', 'MT', 'TN', 'OH', 'OR', 'IA'],
 ['NV', 'KY', 'NM', 'KS', 'IN', 'LA', 'DE', 'MD', 'CO', 'IL', 'VA', 'NC', 'WY', 'NJ', 'WA', 'ME']]

hill_climb_nbr(groups,3)的输出,其中groups是上面显示的列表列表,如下所示:

[[['VT', 'TX', 'HI', 'AR', 'PA', 'OK', 'AK', 'MI', 'ND', 'ID', 'NY', 'WV', 'FL', 'UT'],
  ['MO', 'MA', 'SD', 'NE', 'GA', 'MN', 'SC', 'CA', 'RI', 'AZ', 'NH', 'MS', 'AL', 'WI', 'GU', 'CT', 'MT', 'TN', 'OH', 'OR', 'IA'],
  ['NV', 'KY', 'NM', 'KS', 'IN', 'LA', 'DE', 'MD', 'CO', 'IL', 'VA', 'NC', 'WY', 'NJ', 'WA', 'ME']],
 [['VT', 'TX', 'HI', 'AR', 'PA', 'OK', 'AK', 'MI', 'ND', 'ID', 'NY', 'WV', 'FL', 'UT'],
  ['MO', 'MA', 'SD', 'NE', 'GA', 'MN', 'SC', 'CA', 'RI', 'AZ', 'NH', 'MS', 'AL', 'WI', 'GU', 'CT', 'MT', 'TN', 'OH', 'OR', 'IA'],
  ['NV', 'KY', 'NM', 'KS', 'IN', 'LA', 'DE', 'MD', 'CO', 'IL', 'VA', 'NC', 'WY', 'NJ', 'WA', 'ME']],
 [['VT', 'TX', 'HI', 'AR', 'PA', 'OK', 'AK', 'MI', 'ND', 'ID', 'NY', 'WV', 'FL', 'UT'],
  ['MO', 'MA', 'SD', 'NE', 'GA', 'MN', 'SC', 'CA', 'RI', 'AZ', 'NH', 'MS', 'AL', 'WI', 'GU', 'CT', 'MT', 'TN', 'OH', 'OR', 'IA'],
  ['NV', 'KY', 'NM', 'KS', 'IN', 'LA', 'DE', 'MD', 'CO', 'IL', 'VA', 'NC', 'WY', 'NJ', 'WA', 'ME']]]

看起来很紧张,但它只是重复三次的列表。

在尝试诊断问题时,我发现groups_copygroup_list.append(groups_copy)之前看起来正确。不知何故,最后的group_list证明是最后一次groups_copy重复nbr_size时代而不是groups_copy的每次迭代。

我一直在看这个几个小时,我即将放松心情。对于问题所在,有什么特别突出的吗?

python append
1个回答
2
投票

它仍然不是一个最小的例子,但它足够接近调试。

你的问题是你的问题

groups_copy = groups

不复制列表 - 它只是将引用复制到顶层。即使是通常的解决方案

groups_copy = groups[:]

不会修复它,因为这是一个嵌套列表 - 切片只复制顶层。

你需要一个deep copy

from random import randint as rand
from copy import deepcopy

groups = [['VT', 'TX', 'HI'],
          ['MO', 'MA', 'SD'],
          ['NV', 'KY', 'NM'],
         ]

...

    groups_copy = deepcopy(groups)

输出:

0
0
1
[['TX', 'HI', 'KY'], ['MA', 'SD', 'VT'], ['NV', 'NM', 'MO']]
group_list
[[['TX', 'HI', 'KY'], ['MA', 'SD', 'VT'], ['NV', 'NM', 'MO']]]
2
0
1
[['VT', 'TX', 'KY'], ['MA', 'SD', 'HI'], ['NV', 'NM', 'MO']]
group_list
[[['TX', 'HI', 'KY'], ['MA', 'SD', 'VT'], ['NV', 'NM', 'MO']], [['VT', 'TX', 'KY'], ['MA', 'SD', 'HI'], ['NV', 'NM', 'MO']]]
2
2
1
[['VT', 'TX', 'KY'], ['MO', 'MA', 'HI'], ['NV', 'NM', 'SD']]
group_list
[[['TX', 'HI', 'KY'], ['MA', 'SD', 'VT'], ['NV', 'NM', 'MO']],
 [['VT', 'TX', 'KY'], ['MA', 'SD', 'HI'], ['NV', 'NM', 'MO']],
 [['VT', 'TX', 'KY'], ['MO', 'MA', 'HI'], ['NV', 'NM', 'SD']]]

我将换行符插入到最后一行,以使结果更易于阅读。

© www.soinside.com 2019 - 2024. All rights reserved.