在对象数组中查找坐标

时间:2019-04-13 18:05:32

标签: python

我有一个像这样的对象数组[{'x':-50,'y':30},{'x':70,'y':-68} ...]最大范围是-200 | +200。

我需要找到某些坐标范围内的所有坐标。假设我加上坐标50 | 50和范围20,因此max x为70 low 30和max y 70 and low y 30。

因此它应该找到该范围内的所有坐标并返回一个新的对象列表。

我为x坐标尝试了此方法及其工作,但为y尝试了很多。

感谢您的帮助。

def find_coords(self, x, y, z):
    with open('allcoords.json') as json_file:
        data = json.load(json_file)
        xcoords = []
        for s in data:
            if s['x'] > (int(x) + int(z)):
                break
            if s['x'] > (int(x) - int(z)):
                xcoords.append(s)
        ycoords = []
        for ys in xcoords:
            if ys['y'] > (int(y) + int(z)):
                break
            if ys['y'] > (int(y) - int(z)):
                ycoords.append(ys)

1 个答案:

答案 0 :(得分:0)

您正在遍历存储在allcords.json中的字典数组。代码本身可以,但是对于Y坐标,您引用的源数据错误。 Y线也位于data中,但是您要遍历ycoords,这是一个空数组,没有任何意义。

def find_coords(self, x, y, z):
    with open('allcoords.json') as json_file:
        data = json.load(json_file)
        xcoords = []
        for s in data:
            if s['x'] > (int(x) + int(z)):
                break
            if s['x'] > (int(x) - int(z)):
                xcoords.append(s)
        ycoords = []
        for ys in data:
            if ys['y'] > (int(y) + int(z)):
                break
            if ys['y'] > (int(y) - int(z)):
                ycoords.append(ys)

此外,我认为这段代码太复杂了。您可以使用filter方法重写以下内容,使其更具可读性:

def find_coords(self, x, y, z):
    with open('allcoords.json') as json_file:
        data = json.load(json_file)
        xcoords = list(filter(lambda s:  int(x) - int(z) < s['x'] < int(x) + int(z), data))
        ycoords = list(filter(lambda s:  int(y) - int(z) < s['y'] < int(y) + int(z), data))

编辑:基于评论中的讨论。

对不起,我误解了您到底想要什么。我想最后您可能只需要以下内容:

def find_coords(self, x, y, z):
    with open('allcoords.json') as json_file:
        data = json.load(json_file)
        coords = list(
            filter(
                lambda s: (
                   int(x) - int(z) < s['x'] < int(x) + int(z)
                   and int(y) - int(z) < s['y'] < int(y) + int(z)
            data)
        )