Django / Python - 从每个分配给对象的生成值返回一个排序列表

时间:2014-02-19 03:30:17

标签: python django django-templates

我有一个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 %}

2 个答案:

答案 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])