分享
三行代码  ›  专栏  ›  技术社区  ›  PESTLEWeb

做这件事的一种漂亮的,蟒蛇式的方式是什么? - What is a beautiful, Pythonesque way of doing this?

  •  -1
  • PESTLEWeb  · 技术社区  · 3 月前

    以下代码适用于我,但不是“漂亮的”/“皮索尼斯克”。你能推荐一种更漂亮的/蟒蛇式的方法吗?

        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,         
        ]
    

    然后创建两个新列表,根据“奖励批次”中的相应项目是否符合阈值,分别是“状态批次”和“操作批次”的过滤版本。

    我可以想象一种用单子理解来完成这个任务的方法,比如:

    Elite_States=[州内州的州的州-批次[X][Y]如果奖励\批次[X][Y]>奖励\阈值]

    但是,当然,这包括变量“x”和“y”,它们是“隐式的”

    (顺便说一下,这是Corsera强化学习辅导的一部分。我不是在寻求帮助来解决分配问题。因为上面的代码已经起作用了。我只想通过编写更漂亮的代码来提高我的Python知识。

    1 回复  |  直到 3 月前
        1
  •  1
  •   Ulf Aslak    3 月前

    这是一个建议。循环遍历包含要筛选的值的列表的枚举,如果值超过阈值,则将给定索引的值放入“精英”列表。

    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])
    

    python的核心思想是始终将可读性放在紧凑性(甚至速度)之上。查看 Zen of Python .如果你尊重这些原则,你可以称你的代码为“蟒蛇”。