【问题标题】:Checking if a tuple is in range检查元组是否在范围内
【发布时间】:2014-11-03 14:38:41
【问题描述】:

在我的关卡编辑程序中,我有以下代码,用于删除已移出可玩区域的游戏片段:

x, y = theobj.pos
if x not in range(0,79):
    level.remove_obj(theobj)
if y not in range(0,29):
    level.remove_obj(theobj)

有没有什么有效的方法可以将它简化为一个 if 语句?我考虑过使用列表推导来生成所有有效位置元组的列表,但这似乎有点臃肿。

【问题讨论】:

    标签: python python-3.x comparison-operators


    【解决方案1】:

    你可以使用:

    if not (0 <= x <= 78 and 0 <= y <= 28):
        level.remove_obj(theobj)
    

    这使用chained comparisons 来测试xy 的两个边界。

    我不会在这里创建range() 对象;您正在为每个测试创建一个新对象。

    演示:

    >>> x, y = 10, 10
    >>> (0 <= x <= 78 and 0 <= y <= 28)
    True
    >>> x, y = 10, 42
    >>> (0 <= x <= 78 and 0 <= y <= 28)
    False
    >>> x, y = 81, 10
    >>> (0 <= x <= 78 and 0 <= y <= 28)
    False
    

    【讨论】:

    • 这样好多了 - 虽然我仍然需要解压缩元组。
    • @Schilcote:您仍然需要解包或内联。 if not (0 &lt;= theobj.pos[0] &lt;= 78 and 0 &lt;= theobj.pos[1] &lt;= 28): 还不错。
    • @Dabrion:如何使用 lambda?封装范围检查?这仍然是定义 lambda 的额外行。
    • 目前还不清楚他是想编码高尔夫还是他想要更有效的方式。过滤集合的最佳方法是使用 itertools 或列表推导。在这两种情况下,lambda 都很方便。
    • lambda 怎么样?像这样:[obj for obj in col if (lambda x,y: 0&lt;=x&lt;=78 and 0&lt;=y&lt;=28)(*obj)]
    猜你喜欢
    • 1970-01-01
    • 2023-04-03
    • 2017-07-13
    • 1970-01-01
    • 2021-03-30
    • 2016-05-03
    • 2015-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多