在做RL的时候需要存储四个状态作为一个四元组,可以使用namedtuple,而不是放在一个列表里面使用下标来访问其中的元素,这样使得代码具有更好的可读性。
Transition = namedtuple('Transition',('state','action','next_state','reward'))
t=Transition(1,2,3,4)
print(t.action)
>>> 2
t=Transition((1,2,3,4),(9,8,7,6),[2,3,4,5],[6,32,3,4])
print(t.action)
>>>(9, 8, 7, 6)
print(t)
>>>Transition(state=(1, 2, 3, 4), action=(9, 8, 7, 6), next_state=[2, 3, 4, 5], reward=[6, 32, 3, 4])
把上面的四个信息看成是4个不同的状态信息,我们想把一个状态对应的信息结合到一起可以使用zip
函数,zip前面的 * 号是取元素的意思,t前面的 * 号是解除一层括号的意思(中括号列表,小括号元组),其实理解起来本质上是一样的,都是去除对象里面的元素。
t=Transition((1,2,3,4),(9,8,7,6),[2,3,4,5],[6,32,3,4])
print(*zip(*t))
>>>(1, 9, 2, 6) (2, 8, 3, 32) (3, 7, 4, 3) (4, 6, 5, 4)
print(*zip((1,2,3,4),(9,8,7,6),[2,3,4,5],[6,32,3,4]))
>>>(1, 9, 2, 6) (2, 8, 3, 32) (3, 7, 4, 3) (4, 6, 5, 4)
l=[1,2,3,4]
print(*l)
>>>1,2,3,4