遍历和处理两个列表并从中创建新列表的规范Python方法是什么?

遍历和处理两个列表并从中创建新列表的规范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

下面的代码适合我,但不是“漂亮的”/“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] >= 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])