列表中相同位置对象的计算和比较
Calculation and comparison of objects in lists in the same position
我有一个问题,希望你能帮助我。在我的项目中,我有一个虚拟时间,它会在脚本启动后立即运行(1 秒中的 24 虚拟秒)。这个时间记录在一个列表中,并从 main 传递给需要它的 classes。该列表由五个元素组成[0, 0, 0, 0, 0],第一个是分钟,第二个是小时,第三个是天,第四个是月,第五个是年
self.gTime = self.__engine.time
self.vTime = copy.deepcopy(self.gTime)
gTime
是一般虚拟时间,vTime
是根据事件变化的时间。
__grow = {
"0": [10, 0, 0, 0, 0],
"1": [10, 0, 0, 0, 0],
"2": [10, 0, 0, 0, 0],
"3": [10, 0, 0, 0, 0],
"4": [10, 0, 0, 0, 0],
}
这是一本迷你词典,其中有五个必须发生的事件。这些事件(里面的数字目前用于测试)用简单的话表示该事件发生需要经过多长时间。每当该事件发生时,vTime
将更新为 gTime
的值,并且循环继续下一阶段。
所以我创建了这个函数:
def update_age(self):
if self.__age <= len(self.__grow) - 1:
for i, n in enumerate(self.gTime):
if abs(self.gTime[i] - self.vTime[i]) == self.__grow[str(self.__age)][i]:
self.vTime = copy.deepcopy(self.gTime)
self.__age += 1
else:
pass
其中 age
决定应该发生哪个事件。
现在,如果我启动脚本,我会收到此错误:
if abs(self.gTime[i] - self.vTime[i]) == self.__grow[str(self.__age)][i]:
KeyError: '5'
此外,在脚本错误结束之前,我可以看出事件的顺序发生得太快了。
如果我将 self.__grow[str (self.__age)][i]
替换为例如 10,则脚本可以正常工作。
我应该如何更改才能使其正常工作?感谢您的帮助。
编辑:
在主class中滚动时间是这样生成的:
self.__time = [0, 0, 0, 0, 0, 0, 0]
self.time = [0, 0, 0, 0, 0]
def __time_update(self):
time = datetime.now()
if int(time.strftime("%S")) != self.__time[0]:
self.__time[0] = copy.deepcopy(int(time.strftime("%S")))
if self.__time[1] >= 60:
self.__time[1] = self.__time[1] - 60
self.__time[2] += 1
if self.__time[2] >= 60:
self.__time[2] = 0
self.__time[3] += 1
if self.__time[3] >= 24:
self.__time[3] = 0
self.__time[4] += 1
if self.__time[4] >= 30:
self.__time[4] = 0
self.__time[5] += 1
if self.__time[5] >= 4:
self.__time[5] = 0
self.__time[6] += 1
self.__time[1] += 24
if self.__time[2] % 10 == 0:
self.time[0] = copy.deepcopy(self.__time[2])
self.time[1] = copy.deepcopy(self.__time[3])
self.time[2] = copy.deepcopy(self.__time[4])
self.time[3] = copy.deepcopy(self.__time[5])
self.time[4] = copy.deepcopy(self.__time[6])
__time
每次退出脚本时,它都会在外部保存并在再次启动脚本时重新加载。
例如,第一部分应该模拟一棵树的生长(由五个阶段组成),该部分必须在实体生成后立即开始。每当 age
发生变化(因此发生了一个阶段)时,精灵就会更改为新的。
编辑 2:
不幸的是,建议的解决方案在解决生成的错误时来自不同类型的问题:Click for image
在第一部分,它是您如何看待它执行建议的更改。理论上的第二部分是我通过将 self.__grow[str (self.__age)][i]
替换为例如 10 得到的应该如何(在测试中,到最后阶段的更改应该每 10 分钟发生一次)。最后一部分是错误。
要么我改一下虚拟时钟的工作方式,要么我真心不知道怎么解决...
编辑 3:
最后,我设法通过创建一个外部模块来解决:
from datetime import datetime
from copy import deepcopy
gTime = [0, 0, 0, 0, 0]
name_day = 0
__dt = 0
__s = 0
__m = 0
__h = 0
__dy = 0
__st = 0
__mh = 0
__y = 0
__local = "it"
__nDay = {
"en": {
"0": "Monday",
"1": "Tuesday",
"2": "Wednesday",
"3": "Thursday",
"4": "Friday",
"5": "Saturday",
"6": "Sunday"
},
"it": {
"0": "Lunedì",
"1": "Martedì",
"2": "Mercoledì",
"3": "Giovedì",
"4": "Venerdì",
"5": "Sabato",
"6": "Domenica"
},
}
def time_update():
global __dt, __s, __m, __h, __dy, __st, __mh, __y, gTime, name_day
vTime = datetime.now()
if int(vTime.strftime("%S")) != __dt:
__dt = deepcopy(int(vTime.strftime("%S")))
if __s >= 60:
__s = __s - 60
__m += 1
if __m >= 60:
__m = 0
__h += 1
if __h >= 24:
__h = 0
__dy += 1
__st += 1
if __st >= 7:
__st = 0
if __dy >= 30:
__dy = 0
__mh += 1
if __mh >= 4:
__mh = 0
__y += 1
__s += 24
if __m % 10 == 0:
gTime[0] = deepcopy(__m)
gTime[1] = deepcopy(__h)
gTime[2] = deepcopy(__dy)
gTime[3] = deepcopy(__mh)
gTime[4] = deepcopy(__y)
name_day = __nDay[__local][str(__st)]
def calculation_time(vList, cList):
m = vList[0] + cList[0]
h = vList[1] + cList[1]
d = vList[2] + cList[2]
ms = vList[3] + cList[3]
y = vList[4] + cList[4]
if m >= 60:
h += 1
m = 0
if h >= 24:
d += 1
h = 0
if d >= 30:
ms += 1
d = 0
if ms >= 4:
y += 1
ms = 0
if gTime[0] >= m:
if gTime[1] >= h:
if gTime[2] >= d:
if gTime[3] >= ms:
if gTime[4] >= y:
return True
time_update()
每次更新时由主 class 调用,而 calculation_time()
由需要知道的个体实体 classes 调用是时候改变行为了。
感谢所有回复的人,我希望这对以后的人有所帮助。
如果我理解正确的话:
def update_age(self):
if self.__age <= len(self.__grow) - 1:
c=0
for i, n in enumerate(self.gTime):
if abs(self.gTime[i] - self.vTime[i]) >= self.__grow[str(self.__age)][i]:
self.vTime = copy.deepcopy(self.gTime)
c += 1
if(c==i+1):
self.__age += 1
else:
pass
根据您的说法 - 我也会放弃 abs()
,但这与整体处理无关,只是一种简化...
我有一个问题,希望你能帮助我。在我的项目中,我有一个虚拟时间,它会在脚本启动后立即运行(1 秒中的 24 虚拟秒)。这个时间记录在一个列表中,并从 main 传递给需要它的 classes。该列表由五个元素组成[0, 0, 0, 0, 0],第一个是分钟,第二个是小时,第三个是天,第四个是月,第五个是年
self.gTime = self.__engine.time
self.vTime = copy.deepcopy(self.gTime)
gTime
是一般虚拟时间,vTime
是根据事件变化的时间。
__grow = {
"0": [10, 0, 0, 0, 0],
"1": [10, 0, 0, 0, 0],
"2": [10, 0, 0, 0, 0],
"3": [10, 0, 0, 0, 0],
"4": [10, 0, 0, 0, 0],
}
这是一本迷你词典,其中有五个必须发生的事件。这些事件(里面的数字目前用于测试)用简单的话表示该事件发生需要经过多长时间。每当该事件发生时,vTime
将更新为 gTime
的值,并且循环继续下一阶段。
所以我创建了这个函数:
def update_age(self):
if self.__age <= len(self.__grow) - 1:
for i, n in enumerate(self.gTime):
if abs(self.gTime[i] - self.vTime[i]) == self.__grow[str(self.__age)][i]:
self.vTime = copy.deepcopy(self.gTime)
self.__age += 1
else:
pass
其中 age
决定应该发生哪个事件。
现在,如果我启动脚本,我会收到此错误:
if abs(self.gTime[i] - self.vTime[i]) == self.__grow[str(self.__age)][i]:
KeyError: '5'
此外,在脚本错误结束之前,我可以看出事件的顺序发生得太快了。
如果我将 self.__grow[str (self.__age)][i]
替换为例如 10,则脚本可以正常工作。
我应该如何更改才能使其正常工作?感谢您的帮助。
编辑:
在主class中滚动时间是这样生成的:
self.__time = [0, 0, 0, 0, 0, 0, 0]
self.time = [0, 0, 0, 0, 0]
def __time_update(self):
time = datetime.now()
if int(time.strftime("%S")) != self.__time[0]:
self.__time[0] = copy.deepcopy(int(time.strftime("%S")))
if self.__time[1] >= 60:
self.__time[1] = self.__time[1] - 60
self.__time[2] += 1
if self.__time[2] >= 60:
self.__time[2] = 0
self.__time[3] += 1
if self.__time[3] >= 24:
self.__time[3] = 0
self.__time[4] += 1
if self.__time[4] >= 30:
self.__time[4] = 0
self.__time[5] += 1
if self.__time[5] >= 4:
self.__time[5] = 0
self.__time[6] += 1
self.__time[1] += 24
if self.__time[2] % 10 == 0:
self.time[0] = copy.deepcopy(self.__time[2])
self.time[1] = copy.deepcopy(self.__time[3])
self.time[2] = copy.deepcopy(self.__time[4])
self.time[3] = copy.deepcopy(self.__time[5])
self.time[4] = copy.deepcopy(self.__time[6])
__time
每次退出脚本时,它都会在外部保存并在再次启动脚本时重新加载。
例如,第一部分应该模拟一棵树的生长(由五个阶段组成),该部分必须在实体生成后立即开始。每当 age
发生变化(因此发生了一个阶段)时,精灵就会更改为新的。
编辑 2:
不幸的是,建议的解决方案在解决生成的错误时来自不同类型的问题:Click for image
在第一部分,它是您如何看待它执行建议的更改。理论上的第二部分是我通过将 self.__grow[str (self.__age)][i]
替换为例如 10 得到的应该如何(在测试中,到最后阶段的更改应该每 10 分钟发生一次)。最后一部分是错误。
要么我改一下虚拟时钟的工作方式,要么我真心不知道怎么解决...
编辑 3:
最后,我设法通过创建一个外部模块来解决:
from datetime import datetime
from copy import deepcopy
gTime = [0, 0, 0, 0, 0]
name_day = 0
__dt = 0
__s = 0
__m = 0
__h = 0
__dy = 0
__st = 0
__mh = 0
__y = 0
__local = "it"
__nDay = {
"en": {
"0": "Monday",
"1": "Tuesday",
"2": "Wednesday",
"3": "Thursday",
"4": "Friday",
"5": "Saturday",
"6": "Sunday"
},
"it": {
"0": "Lunedì",
"1": "Martedì",
"2": "Mercoledì",
"3": "Giovedì",
"4": "Venerdì",
"5": "Sabato",
"6": "Domenica"
},
}
def time_update():
global __dt, __s, __m, __h, __dy, __st, __mh, __y, gTime, name_day
vTime = datetime.now()
if int(vTime.strftime("%S")) != __dt:
__dt = deepcopy(int(vTime.strftime("%S")))
if __s >= 60:
__s = __s - 60
__m += 1
if __m >= 60:
__m = 0
__h += 1
if __h >= 24:
__h = 0
__dy += 1
__st += 1
if __st >= 7:
__st = 0
if __dy >= 30:
__dy = 0
__mh += 1
if __mh >= 4:
__mh = 0
__y += 1
__s += 24
if __m % 10 == 0:
gTime[0] = deepcopy(__m)
gTime[1] = deepcopy(__h)
gTime[2] = deepcopy(__dy)
gTime[3] = deepcopy(__mh)
gTime[4] = deepcopy(__y)
name_day = __nDay[__local][str(__st)]
def calculation_time(vList, cList):
m = vList[0] + cList[0]
h = vList[1] + cList[1]
d = vList[2] + cList[2]
ms = vList[3] + cList[3]
y = vList[4] + cList[4]
if m >= 60:
h += 1
m = 0
if h >= 24:
d += 1
h = 0
if d >= 30:
ms += 1
d = 0
if ms >= 4:
y += 1
ms = 0
if gTime[0] >= m:
if gTime[1] >= h:
if gTime[2] >= d:
if gTime[3] >= ms:
if gTime[4] >= y:
return True
time_update()
每次更新时由主 class 调用,而 calculation_time()
由需要知道的个体实体 classes 调用是时候改变行为了。
感谢所有回复的人,我希望这对以后的人有所帮助。
如果我理解正确的话:
def update_age(self):
if self.__age <= len(self.__grow) - 1:
c=0
for i, n in enumerate(self.gTime):
if abs(self.gTime[i] - self.vTime[i]) >= self.__grow[str(self.__age)][i]:
self.vTime = copy.deepcopy(self.gTime)
c += 1
if(c==i+1):
self.__age += 1
else:
pass
根据您的说法 - 我也会放弃 abs()
,但这与整体处理无关,只是一种简化...