通过函数运行列表

时间:2019-01-31 03:35:16

标签: python

我定义了一个函数,该函数将一个点与两个不同的点进行比较,如果满足两个True条件,则返回if

我现在希望函数接受3个输入的列表,而不是单个输入,并且仅当列表中的所有3个输入都满足我的True条件时才返回if

我不知道如何更改代码来实现这一目标。

免责声明:我是python的新手。我只做了两个星期。对我好一点:)

#code #1 to allow one input for "point"

def isIn(firstCorner=(0,0), secondCorner=(0,0), point=(0,0)):
    if (firstCorner[0] >= point[0] >=  secondCorner[0] ) and (firstCorner[1] >= point[1] >=  secondCorner[1] ):
            print(True)
    elif (secondCorner[0] >= point[0] >=  firstCorner[0] ) and (secondCorner[1] >= point[1] >=  firstCorner[1] ):
            print(True)
    elif (firstCorner[0] >= point[0] >=  secondCorner[0] ) and (firstCorner[1] <= point[1] <=  secondCorner[1] ):
            print(True)
    elif (secondCorner[0] >= point[0] >=  firstCorner[0] ) and (secondCorner[1] <= point[1] <=  firstCorner[1] ):
            print(True)
    else: 
        print(False)

#inputs to test if my code works

isIn((70,2), (60,45), (60,4)) 
isIn((999,645), (2345,100), (1100,101))


#code #2 to allow list of inputs under "pointList". this is definetly wrong and i can't figure out what i need to do to make this work

def allIn(firstCorner=(0,0), secondCorner=(0,0), pointList=[]):
    for x in allIn(pointList):
        if (firstCorner[0] >= pointList[0]>=  secondCorner[0] ) and (firstCorner[1] >= pointList[1] >=  secondCorner[1] ):
            print(True)
        elif (secondCorner[0] >= pointList[0] >=  firstCorner[0] ) and (secondCorner[1] >= pointList[1] >=  firstCorner[1] ):
             print(True)
        elif (firstCorner[0] >= pointList[0] >=  secondCorner[0] ) and (firstCorner[1] <= pointList[1] <=  secondCorner[1] ):
            print(True)
        elif (secondCorner[0] >= pointList[0] >=  firstCorner[0] ) and (secondCorner[1] <= pointList[1] <=  firstCorner[1] ):
             print(True)
        else: 
            print(False)

#inputs to test code above

allIn((0,0), (5,5), [(1,1), (0,0), (5,5)])

我想更改代码编号1,以便能够列出2个坐标/输入而不是2个坐标/输入。所有“ if”条件都应该相同,并且仅当列表中的所有输入都满足条件时才返回True。即使列表中的一组坐标不符合条件,也要返回False

1 个答案:

答案 0 :(得分:0)

如果我的理解正确,您的函数将使用两个点来定义一个区域(它们是与系统的轴平行的边的区域的对角)和第三个点,它返回该点是否落在该区域内

您正在寻求使该函数成为一个列表,并检查列表中所有点的 all 是否落在该区域中,而不是只获取一个点。

首先,有很多库函数可以执行此操作以及更多操作,因此,如果有认真的应用程序,也许您应该考虑使用它们。尤其是如果您以后需要检查更复杂的区域。

但是,要做您想做的事情,一种非常干净的方法是拥有一个检查一个点的函数,然后编写第二个函数,该函数为列表中的所有项目调用第一个函数。

赞:

def is_in(corner1, corner2, point):
    min_x, max_x = sorted([corner1[0], corner2[0]])
    min_y, max_y = sorted([corner1[1], corner2[1]])
    return (min_x <= point[0] <= max_x) and (min_y <= point[1] <= max_y)


def all_in(corner1, corner2, points):
    return all(is_in(corner1, corner2, p) for p in points)


print(all_in((0, 0), (5, 5), [(1, 1), (0, 0), (5, 5)]))

我也可以自由地重写isIn函数(并重命名is_in,因为这更符合Python命名约定)。

首先要算出要比较的值,然后一次性返回整个比较的结果。

要回答有关代码的实际问题:

  • 您在第一行调用了函数本身,这是一个问题。
  • 尽管您似乎想用x遍历列表,但您并没有将x与角落进行比较

您的固定代码:

def allIn(firstCorner, secondCorner, pointList):
    for x in pointList:
        if (firstCorner[0] >= x[0] >= secondCorner[0]) and (firstCorner[1] >= x[1] >= secondCorner[1]):
            print(True)
        elif (secondCorner[0] >= x[0] >= firstCorner[0]) and (secondCorner[1] >= x[1] >= firstCorner[1]):
            print(True)
        elif (firstCorner[0] >= x[0] >= secondCorner[0]) and (firstCorner[1] <= x[1] <= secondCorner[1]):
            print(True)
        elif (secondCorner[0] >= x[0] >= firstCorner[0]) and (secondCorner[1] <= x[1] <= firstCorner[1]):
            print(True)
        else:
            print(False)

尽管如此,您还假设拐角以特定方式排序,这不是很直观。而且您的函数不会收集结果,它只会打印出各个点是否在列表中。

以我的示例为例:

def print_all_in(corner1, corner2, points):
    for p in points:
        print(is_in(corner1, corner2, p))

我的代码的效率低下是每次对点进行排序-您可以先对它们进行排序,然后仍然使用效率更高的函数来仅检查所有点-但我将由您自己决定。< / p>