【发布时间】:2020-04-07 16:19:33
【问题描述】:
我有一个函数可以在列表中创建一组结果。这是在for-loop 中,它会在每次迭代中更改其中一个变量。我需要能够单独存储这些列表,以便我可以将每次迭代之间的结果差异显示为图表。
有没有办法像这样单独存储它们?到目前为止,我发现的唯一解决方案是多次复制该函数并手动更改它存储到的列表的变量和名称,但显然这是一种糟糕的方法,我认为必须有一个正确的方法.
这里是代码。该功能很杂乱但有效。理想情况下,我可以将这一切放在另一个 for-loop 中,该循环每次迭代都会更改 deceleration_p,然后将 collected_averages 存储为不同的列表,以便我可以比较每次迭代的 collected_averages。
import numpy as np
import random
import matplotlib.pyplot as plt
from statistics import mean
road_length = 500
deceleration_p = 0.1
max_speed = 5
buffer_road = np.zeros(road_length, dtype=int)
buffer_speed = 0
number_of_iterations = 1000
average_speed = 0
average_speed_list = []
collected_averages = []
total_speed = 0
for cars in range(1, road_length):
empty_road = np.ones(road_length - cars, dtype=int) * -1
cars_on_road = np.ones(cars, dtype=int)
road = np.append(empty_road, cars_on_road)
np.random.shuffle(road)
for i in range(0, number_of_iterations):
# acceleration
for speed in np.nditer(road, op_flags=['readwrite']):
if -1 < speed < max_speed:
speed[...] += 1
# randomisation
for speed in np.nditer(road, op_flags=['readwrite']):
if 0 < speed:
if deceleration_p > random.random():
speed += -1
# slowing down
for cell in range(0, road_length):
speed = road[cell]
for val in range(1, speed + 1):
new_speed = val
if (cell + val) > (road_length - 1):
val += -road_length
if road[cell + val] > -1:
speed = val - 1
road[cell] = new_speed - 1
break
buffer_road=np.ones(road_length, dtype=int)*-1
for cell in range(0, road_length):
speed = road[cell]
buffer_cell = cell + speed
if (buffer_cell) > (road_length - 1):
buffer_cell += -road_length
if speed > -1:
total_speed += speed
buffer_road[buffer_cell] = speed
road = buffer_road
average_speed = total_speed/cars
average_speed_list.append(average_speed)
average_speed = 0
total_speed = 0
steady_state_average=mean(average_speed_list[9:number_of_iterations])
average_speed_list=[]
collected_averages.append(steady_state_average)
【问题讨论】:
-
您好,您可以在帖子中包含代码吗?
-
为什么不把它们存入字典呢?
{'foo': [...], 'bar': [...]}然后你可以查找对应于你传递的每个变量的列表 -
您好!欢迎来到 StackOverflow!请提供您的代码以获得更多关于此问题的帮助,因为 StackOverflow 主要遵循此原则!但是,我建议使用列表列表来完成此特定任务。
-
“我可以在循环中创建新的命名变量”的答案是肯定的。这是正确的做法吗?只有大约 0.0001% 的时间。相反,使用像列表这样的容器,将每个循环的结果附加到末尾,或者使用有意义的键名的字典。
-
使变量成为数组列表,并在每次迭代时将结果数组附加到它。通常,您不想动态创建变量 — 请参阅 How do I create a variable number of variables?