python - 将世界分成垃圾箱
python - divide world into bins
我正在尝试将移动的球放入适当的箱子中。我喜欢认为我走在正确的轨道上,但我已经被困了一段时间了。
我遗漏了似乎与我的问题无关的代码,但如果回答者需要更多详细信息,我可以提供。基本上,我有一个由 200 个移动球组成的世界。它们具有 X 和 Y 坐标。我想将世界划分为宽度为 256 的方形容器,并将球放入适当的容器中。
我的方法是将它们放入字典中。它看起来像这样:
dict_of_balls = {}
for i in range(len(balls)):
xb = int(balls[i].x/256)
yb = int(balls[i].y/256)
我想将键设为 (xb, yb)
对的元组,然后将适当的球放入该容器中,但我认为您不能将元组用作键...
代码如下:
import math
import random
import time
import sys
ball_min_radius = 16.0 #world coordinates
ball_max_radius = 128.0 #world coordniates
number_balls = 200
class Ball:
"""
Implements a point/ball
"""
def __init__(self):
self.x = random.uniform(world_min_x,world_max_x)
self.y = random.uniform(world_min_y,world_max_y)
self.radius = int(random.uniform(ball_min_radius,ball_max_radius))
def __lt__(self, other):
return self.id < other.id
def main():
world_min_x = -200.0*number_balls**.5 # minimum x in world coordinates
world_max_x = +200.0*number_balls**.5 # maximum x in world coordinates
world_min_y = -200.0*number_balls**.5 # minimum y in world coordinates
world_max_y = +200.0*number_balls**.5 # maximum y in world coordinates
balls = [Ball() for i in range(number_balls)]
所以有没有人知道如何根据给定的世界坐标将世界划分为垃圾箱?我不确定要使用哪种数据结构,因为我不能将元组用作键。提前感谢您的任何反馈。
你为什么要字典?以下是您将如何执行此操作,但请记住,您将 仅 每个垃圾箱得到一个球,因为您专门将他们的密钥投射为 (int, int) 并且密钥是唯一的。
如果使用集合,还可以排序(在我的示例中,我按区域标识符排序):
我不确定你这样做是为了什么,但你可以这样做:
import math
import random
import time
import sys
ball_min_radius = 16.0 #world coordinates
ball_max_radius = 128.0 #world coordniates
number_balls = 200
world_min_x = -200.0*number_balls**.5 # minimum x in world coordinates
world_max_x = +200.0*number_balls**.5 # maximum x in world coordinates
world_min_y = -200.0*number_balls**.5 # minimum y in world coordinates
world_max_y = +200.0*number_balls**.5 # maximum y in world coordinates
class Ball:
"""
Implements a point/ball
"""
def __init__(self):
self.x = random.uniform(world_min_x,world_max_x)
self.y = random.uniform(world_min_y,world_max_y)
self.radius = int(random.uniform(ball_min_radius,ball_max_radius))
def __lt__(self, other):
return self.id < other.id
def __str__(self):
return 'x={x} y={y} r={r}'.format(x=self.x, y=self.y, r=self.radius)
def main():
balls = [Ball() for i in range(number_balls)]
dict_of_balls = {}
ball_collection = []
for b in balls:
xb = int(b.x/256)
yb = int(b.y/256)
key = (xb, yb)
dict_of_balls[key] = b
ball_collection.append((key, b))
print 'length of dictionary:{}'.format(len(dict_of_balls.keys()))
print 'length of collection:{}'.format(len(ball_collection))
请注意,字典中的项目少于集合中的项目。
您也可以用这种方式非常简单地打印每一项:
for b in ball_collection:
print 'ball region: {r} with coords: {c}'.format(r=b[0], c=b[1])
或者,如果需要,对它们进行排序:
print 'Collections also let you sort the collection by region(s)...'
sorted_list = sorted(ball_collection, key= lambda x: (x[0][0], x[0][1]))
for b in sorted_list:
print 'ball region: {r} with coords: {c}'.format(r=b[0], c=b[1])
您也可以非常简单地在特定区域获得球:
print '... or get only ones in a specific region'
subset = [b for b in ball_collection if b[0][0] == 1]
for b in subset:
print 'ball region: {r} with coords: {c}'.format(r=b[0], c=b[1])
main()
一个集合似乎可以满足您的需求实际上。
您可以将元组用作字典中的键,因为元组是不可变的。唯一不能用于字典键的数据类型是列表 []
或集合 {}
**a = {(1,2):'example1', (2,3):'example2'}
>>> a[(1,2)]
'example1'**
所以我相信这应该可以更轻松地解决您的问题。
我正在尝试将移动的球放入适当的箱子中。我喜欢认为我走在正确的轨道上,但我已经被困了一段时间了。
我遗漏了似乎与我的问题无关的代码,但如果回答者需要更多详细信息,我可以提供。基本上,我有一个由 200 个移动球组成的世界。它们具有 X 和 Y 坐标。我想将世界划分为宽度为 256 的方形容器,并将球放入适当的容器中。
我的方法是将它们放入字典中。它看起来像这样:
dict_of_balls = {}
for i in range(len(balls)):
xb = int(balls[i].x/256)
yb = int(balls[i].y/256)
我想将键设为 (xb, yb)
对的元组,然后将适当的球放入该容器中,但我认为您不能将元组用作键...
代码如下:
import math
import random
import time
import sys
ball_min_radius = 16.0 #world coordinates
ball_max_radius = 128.0 #world coordniates
number_balls = 200
class Ball:
"""
Implements a point/ball
"""
def __init__(self):
self.x = random.uniform(world_min_x,world_max_x)
self.y = random.uniform(world_min_y,world_max_y)
self.radius = int(random.uniform(ball_min_radius,ball_max_radius))
def __lt__(self, other):
return self.id < other.id
def main():
world_min_x = -200.0*number_balls**.5 # minimum x in world coordinates
world_max_x = +200.0*number_balls**.5 # maximum x in world coordinates
world_min_y = -200.0*number_balls**.5 # minimum y in world coordinates
world_max_y = +200.0*number_balls**.5 # maximum y in world coordinates
balls = [Ball() for i in range(number_balls)]
所以有没有人知道如何根据给定的世界坐标将世界划分为垃圾箱?我不确定要使用哪种数据结构,因为我不能将元组用作键。提前感谢您的任何反馈。
你为什么要字典?以下是您将如何执行此操作,但请记住,您将 仅 每个垃圾箱得到一个球,因为您专门将他们的密钥投射为 (int, int) 并且密钥是唯一的。
如果使用集合,还可以排序(在我的示例中,我按区域标识符排序):
我不确定你这样做是为了什么,但你可以这样做:
import math
import random
import time
import sys
ball_min_radius = 16.0 #world coordinates
ball_max_radius = 128.0 #world coordniates
number_balls = 200
world_min_x = -200.0*number_balls**.5 # minimum x in world coordinates
world_max_x = +200.0*number_balls**.5 # maximum x in world coordinates
world_min_y = -200.0*number_balls**.5 # minimum y in world coordinates
world_max_y = +200.0*number_balls**.5 # maximum y in world coordinates
class Ball:
"""
Implements a point/ball
"""
def __init__(self):
self.x = random.uniform(world_min_x,world_max_x)
self.y = random.uniform(world_min_y,world_max_y)
self.radius = int(random.uniform(ball_min_radius,ball_max_radius))
def __lt__(self, other):
return self.id < other.id
def __str__(self):
return 'x={x} y={y} r={r}'.format(x=self.x, y=self.y, r=self.radius)
def main():
balls = [Ball() for i in range(number_balls)]
dict_of_balls = {}
ball_collection = []
for b in balls:
xb = int(b.x/256)
yb = int(b.y/256)
key = (xb, yb)
dict_of_balls[key] = b
ball_collection.append((key, b))
print 'length of dictionary:{}'.format(len(dict_of_balls.keys()))
print 'length of collection:{}'.format(len(ball_collection))
请注意,字典中的项目少于集合中的项目。
您也可以用这种方式非常简单地打印每一项:
for b in ball_collection:
print 'ball region: {r} with coords: {c}'.format(r=b[0], c=b[1])
或者,如果需要,对它们进行排序:
print 'Collections also let you sort the collection by region(s)...'
sorted_list = sorted(ball_collection, key= lambda x: (x[0][0], x[0][1]))
for b in sorted_list:
print 'ball region: {r} with coords: {c}'.format(r=b[0], c=b[1])
您也可以非常简单地在特定区域获得球:
print '... or get only ones in a specific region'
subset = [b for b in ball_collection if b[0][0] == 1]
for b in subset:
print 'ball region: {r} with coords: {c}'.format(r=b[0], c=b[1])
main()
一个集合似乎可以满足您的需求实际上。
您可以将元组用作字典中的键,因为元组是不可变的。唯一不能用于字典键的数据类型是列表 []
或集合 {}
**a = {(1,2):'example1', (2,3):'example2'}
>>> a[(1,2)]
'example1'**
所以我相信这应该可以更轻松地解决您的问题。