附加在第三订单列表上,无法按预期工作

时间:2019-02-13 22:31:49

标签: python append

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

library(tidyverse)
df %>% 
    mutate(year = map2(start, end, `:`)) %>% 
    unnest

以下是输入示例:

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']] (其中groups是上面显示的列表列表)的输出是这样的:

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']], [['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_copy之前看起来是正确的。不知何故,最后的group_list.append(groups_copy)就是重复的group_list次的最后groups_copy次,而不是nbr_size的每次迭代。

我已经看了几个小时了,我要放松一下。您对问题出在哪里有什么看法?

1 个答案:

答案 0 :(得分:2)

它仍然不是 minimum 的示例,但已经足够调试。

您的问题是您的电话

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']]]

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