我有一个像这样的对象数组[{'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)
答案 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)
)