我有一个Django template_tag如下:
目标:基于来自搜索查询的用户输入返回用户指定半径内的房屋。 (例如,在[MY_LOCATION]的15英里范围内向我展示家园。)
@register.assignment_tag
def nearest_homes(location, distance_from):
# Retrieve the locations coords, amongst other things
current_location = geocode(location)
# Now we have lat and long
current_location_coordinates = [current_location[1], current_location[2]]
results = []
for home in homes:
home_coords = [home.latitude, home.longtitude]
# Output is float in miles (e.g. 15.548964313)
distance = distance_miles(current_location_coordinates, home_coords)
if distance <= distance_from:
results.append(home)
return results
这个解决方案可以正常工作并完成它的工作 - 但是“顺序”列表是完全随机的。我希望它以英里为单位按升序排列(这是距离变量在for循环中返回的内容。)
由于我正在返回一个对象列表,我如何追加/分配一个新变量(在这种情况下是与每个对象的距离)并将其作为排序列表返回?只返回一个简单的数字似乎很麻烦。
以下是html模板代码,无论出于何种原因:
{% nearest_homes user_location distance as homes %}
{% if homes %}
{% for home in homes %}
<p>{{ home.address }}</p>
{% end for %}
{% endif %}
答案 0 :(得分:0)
你可能做的是,构建一个字典列表,然后对字典进行排序。有些像
result_home = {home:distance}
results.append(results_home)
然后使用OrderedDict对字典进行排序。
注意:
python 2.7.6中的OrderedDict
答案 1 :(得分:0)
首先将restults
列表中的距离和家庭作为元组附加。然后,您可以使用sort
列表中的results
方法将函数传递给key
方法的sort
关键字参数。例如,results.sort(key=lambda item:item[0])
会使sort方法比较它所排序的每个项目的第一个元素。请参阅:Python list sorting howto
我就是这样做的:
results = []
for home in homes:
home_coords = [home.latitude, home.longtitude]
distance = distance_miles(current_location_coordinates, home_coords)
if distance <= distance_from:
results.append((distance,home))
results.sort(key=lambda item:item[0])