遍历和处理两个列表并从中创建新列表的规范Python方法是什么?
下面的代码适合我,但不是“漂亮的”/“Pythonesque”。你能推荐一种更漂亮的/蟒蛇式的方法吗遍历和处理两个列表并从中创建新列表的规范Python方法是什么?,python,Python,下面的代码适合我,但不是“漂亮的”/“Pythonesque”。你能推荐一种更漂亮的/蟒蛇式的方法吗 elite_states = [] elite_actions = [] for session_i in range(0,len(states_batch)): for t in range(0,len(states_batch[session_i])): if (rewards_batch[session_i] >= r
elite_states = []
elite_actions = []
for session_i in range(0,len(states_batch)):
for t in range(0,len(states_batch[session_i])):
if (rewards_batch[session_i] >= reward_threshold):
elite_states.append(states_batch[session_i][t])
elite_actions.append(actions_batch[session_i][t])
我是Python新手,读过关于列表理解的书,觉得有更好的方法来实现这段代码的功能。它包含三个列表,例如:
states_batch = [
[1,2,3],
[4,2,0,2],
[3,1]
]
actions_batch = [
[0,2,4],
[3,2,0,1],
[3,3]
]
rewards_batch = [
3,
4,
5,
]
然后创建两个新列表,这两个列表是“states\u batch”和“actions\u batch”的过滤版本,具体取决于“rewards\u batch”中的相应项目是否匹配阈值
我可以想象一种使用列表理解的Pythonesque方法,如下所示:
elite_states=[州为州为州_批[x][y]如果奖励_批[x][y]>奖励_阈值]
但是,当然,这包括变量“x”和“y”,它们是“隐式的”
(顺便说一句,这是Corsera强化学习任务的一部分。我不是在寻求帮助来解决这个任务。因为上面的代码已经可以工作了。我只是想通过编写更漂亮的代码来提高我的Python知识。这里有一个建议。你可以循环一个列表的枚举,其中包含你想要过滤的值。)如果值超过阈值,则将给定索引处的值放入“精英”列表
Python的一个核心思想是始终将可读性置于紧凑性(甚至速度)之上。请查看。如果您尊重这些原则,您可以将代码称为“Pythonic”.请提供一个说明您的问题的示例。什么是
奖励\u阈值
?请编辑您的问题,并输入示例输入和预期输出。奖励\u阈值为十进制(实数)编号,以及所有列表的内容。谢谢Ulf。这看起来肯定比我的尝试更优雅。我还将选择该参考资料。不客气!欢迎来到Python社区,请:)不要因为下注太灰心,这可能是因为人们认为你的问题过于复杂和具体。实际上这是一个你想做的简单的事情,所以另一次尝试尽可能少地给出一个概念来实现你想要的。这也是一个自我调试的好方法。乌尔夫,谢谢你。谢谢你这么说,因为那些投了反对票的人肯定会让我在这里再问一个问题。这个问题对我来说似乎非常具体和简洁,但我知道什么…-)
elite_states, elite_actions = [], []
for i, val in enumerate(reward_batch):
if val >= reward_threshold:
elite_states.append(states_batch[i])
elite_actions.append(actions_batch[i])