在 for 循环中将字典添加到列表中,每次运行的最后一个 dict.key 的值未正确添加

我通过创建 for 循环随机删除数据数组的行并重新计算指标(总和)。在 for 循环的每次迭代中,我都会打乱数据并删除第一行值。然后我对剩余行中的值求和。对于每次迭代或运行,我想跟踪运行编号、剩余点的总和以及被删除的行。我通过为每次运行创建结果字典,然后将这些结果附加到列表中来实现此目的。但是,当我打印出结果字典列表时,运行编号和总和是正确的,但每个结果字典中已删除行的值似乎始终是上次运行中删除的行,而不是其特定的值跑步。


import random

import numpy as np


Points = np.array([[1,1,1,1],[2,2,2,2],[3,3,3,3],[4,4,4,4],[5,5,5,5],[6,6,6,6]])

index = 1

all_results = []

N = 5

for i in range(N):

    np.random.shuffle(Points)

    removed_row = Points[:index]

    print(f'Removed row from run {i}: {removed_row}')

    remaining_rows = Points[index:]

    sum = np.sum(remaining_rows)

    run_results = {'Run':i,"Sum of remaining points": sum ,"Removed row": removed_row}

    all_results.append(run_results)

print(all_results)


#output

Removed row from run 0: [[2 2 2 2]]

Removed row from run 1: [[2 2 2 2]]

Removed row from run 2: [[4 4 4 4]]

Removed row from run 3: [[5 5 5 5]]

Removed row from run 4: [[4 4 4 4]]

[{'Run': 0, 'Sum of remaining points': 76, 'Removed row': array([[4, 4, 4, 4]])}, {'Run': 1, 'Sum of remaining points': 76, 'Removed row': array([[4, 4, 4, 4]])}, {'Run': 2, 'Sum of remaining points': 68, 'Removed row': array([[4, 4, 4, 4]])}, {'Run': 3, 'Sum of remaining points': 64, 'Removed row': array([[4, 4, 4, 4]])}, {'Run': 4, 'Sum of remaining points': 68, 'Removed row': array([[4, 4, 4, 4]])}]


正如您所看到的,它似乎总是使用最后一次运行的“removed_row”变量,而不是特定于运行的“removed_row”


Qyouu
浏览 161回答 3
3回答

侃侃无极

嗯,确实很棘手!问题出在任务上:run_results = {'Run':i,"Sum of remaining points": sum ,"Removed row": removed_row}它存储对 的引用removed_row,就像在 Python 中变量只是对对象的引用一样。创建新数组np.array(removed_row):import randomimport numpy as nppoints = np.array([[1, 1, 1, 1], [2, 2, 2, 2], [3, 3, 3, 3], [4, 4, 4, 4], [5, 5, 5, 5], [6, 6, 6, 6]])index = 1all_results = []N = 5for i in range(N):    np.random.shuffle(points)    removed_row = points[:index]    print(f'Removed row from run {i}: {removed_row}')    remaining_rows = points[index:]    sum = np.sum(remaining_rows)    run_results = {'Run':i,"Sum of remaining points": sum ,"Removed row": np.array(removed_row)}    all_results.append(run_results)print(all_results)输出:Removed row from run 0: [[4 4 4 4]]Removed row from run 1: [[6 6 6 6]]Removed row from run 2: [[6 6 6 6]]Removed row from run 3: [[3 3 3 3]]Removed row from run 4: [[4 4 4 4]][{'Run': 0, 'Sum of remaining points': 68, 'Removed row': array([[4, 4, 4, 4]])}, {'Run': 1, 'Sum of remaining points': 60, 'Removed row': array([[6, 6, 6, 6]])}, {'Run': 2, 'Sum of remaining points': 60, 'Removed row': array([[6, 6, 6, 6]])}, {'Run': 3, 'Sum of remaining points': 72, 'Removed row': array([[3, 3, 3, 3]])}, {'Run': 4, 'Sum of remaining points': 68, 'Removed row': array([[4, 4, 4, 4]])}]

炎炎设计

您需要实际删除该行:import randomimport numpy as npPoints = np.array([[1,1,1,1],[2,2,2,2],[3,3,3,3],[4,4,4,4],[5,5,5,5],[6,6,6,6]])index = 1all_results = []N = 5for i in range(N):&nbsp; &nbsp; np.random.shuffle(Points)&nbsp; &nbsp; removed_row = Points[:index]&nbsp; &nbsp; Points = Points[index:]&nbsp; &nbsp; &nbsp;# <<<<<<< Remove row&nbsp; &nbsp; print(f'Removed row from run {i}: {removed_row}')&nbsp; &nbsp; remaining_rows = Points[index:]&nbsp; &nbsp; sum = np.sum(remaining_rows)&nbsp; &nbsp; run_results = {'Run':i,"Sum of remaining points": sum ,"Removed row": removed_row}&nbsp; &nbsp; all_results.append(run_results)print(all_results)输出Removed row from run 0: [[3 3 3 3]]Removed row from run 1: [[6 6 6 6]]Removed row from run 2: [[1 1 1 1]]Removed row from run 3: [[2 2 2 2]]Removed row from run 4: [[4 4 4 4]][{'Run': 0, 'Sum of remaining points': 56, 'Removed row': array([[3, 3, 3, 3]])},&nbsp;&nbsp;{'Run': 1, 'Sum of remaining points': 40, 'Removed row': array([[6, 6, 6, 6]])},&nbsp;&nbsp;{'Run': 2, 'Sum of remaining points': 24, 'Removed row': array([[1, 1, 1, 1]])},&nbsp;&nbsp;{'Run': 3, 'Sum of remaining points': 16, 'Removed row': array([[2, 2, 2, 2]])},&nbsp;&nbsp;{'Run': 4, 'Sum of remaining points':&nbsp; 0, 'Removed row': array([[4, 4, 4, 4]])}]

白衣染霜花

请注意,随机播放需要很长时间。这是一种大量矢量化的方法:# choose the index to drop first:to_drop = np.random.choice(np.arange(len(Points)), N, replace=False)# remain sum:remains = Points.sum(0) - Points[to_drop[::-1]].cumsum(0)out = [{'run':i, 'sum_renmaining': remains[i], 'remove row': Points[to_drop[i]]} for i in range(N)]
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python