我有一些代码接受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
的每次迭代。
我已经看了几个小时了,我要放松一下。您对问题出在哪里有什么看法?
答案 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']]]
我在最后一行插入了换行符,以使结果更易于阅读。