Python 键不为'时字典的排序列表;不存在

Python 键不为'时字典的排序列表;不存在,python,sorting,Python,Sorting,我有一本字典,想按价格升序排序。 但很少有字典对象没有可供排序的价格键。 我想把这些对象移到列表的末尾 我试过下面的代码 sorted(listObj,key=partial(sort_func,['price'])) 使用sort_func的任何其他建议?如果您不想使用lambda,您可以尝试以下方法: new_data = sorted([i for i in data if "price" in i], reverse=True)+[i for i in data if "errorCod

我有一本字典,想按价格升序排序。 但很少有字典对象没有可供排序的价格键。 我想把这些对象移到列表的末尾

我试过下面的代码

sorted(listObj,key=partial(sort_func,['price']))


使用
sort_func
的任何其他建议?

如果您不想使用
lambda
,您可以尝试以下方法:

new_data = sorted([i for i in data if "price" in i], reverse=True)+[i for i in data if "errorCode" in i]
输出:

[{u'price': 5222.0, u'Name': u'United Kingdon'}, {u'price': 5237.0, u'Name': u'US'}, {u'price': 5283.0, u'Name': u'General'}, {u'errorCode': u'500', u'errorMsg': u'Pfffbt. server down.'}, {u'errorCode': u'500', u'errorMsg': u'Pfffbt. server down.'}]

如果不想使用
lambda
,可以尝试以下方法:

new_data = sorted([i for i in data if "price" in i], reverse=True)+[i for i in data if "errorCode" in i]
输出:

[{u'price': 5222.0, u'Name': u'United Kingdon'}, {u'price': 5237.0, u'Name': u'US'}, {u'price': 5283.0, u'Name': u'General'}, {u'errorCode': u'500', u'errorMsg': u'Pfffbt. server down.'}, {u'errorCode': u'500', u'errorMsg': u'Pfffbt. server down.'}]

您可以添加一个“缺少密钥”计数器,并为每个缺少的密钥递增该计数器。返回一个
(缺少的\u键、字段)
的元组,它们将在最后排序,缺少的键最多的排在最后

def sort_func(sort_by, listObj):
    missing_keys = 0
    fields = []
    for key in sort_by:
        if key in listObj:
            fields.append(listObj[key])
        else:
            missing_keys += 1
    return missing_keys, fields
编辑:请求详细解释

元组(和列表)排序如下:比较第一个元素。如果第一个元素不相等,则使用该比较,否则比较第二个元素等。。。。空元组/列表始终小于包含元素的元组/列表。因此:

lst = [
    (), (10,), (1, []), (2, [10, 11]), (2, [100]), (0, [10, 9, 8]), (0, [11]), (1, [1, 1, 2])
]
print(sorted(lst))
印刷品:

[
    (),
    (0, [10, 9, 8]),
    (0, [11]),
    (1, []),
    (1, [1, 1, 2]),
    (2, [10, 11]),
    (2, [100]),
    (10,)
]

sort_func
返回一个元组。如果第一个元素(缺少_键)相等,则由下一个元素(字段)计算。但它首先根据丢失钥匙的数量进行排序

您可以添加一个“缺少密钥”计数器,并为每个缺少的密钥递增该计数器。返回一个
(缺少的\u键、字段)
的元组,它们将在最后排序,缺少的键最多的排在最后

def sort_func(sort_by, listObj):
    missing_keys = 0
    fields = []
    for key in sort_by:
        if key in listObj:
            fields.append(listObj[key])
        else:
            missing_keys += 1
    return missing_keys, fields
编辑:请求详细解释

元组(和列表)排序如下:比较第一个元素。如果第一个元素不相等,则使用该比较,否则比较第二个元素等。。。。空元组/列表始终小于包含元素的元组/列表。因此:

lst = [
    (), (10,), (1, []), (2, [10, 11]), (2, [100]), (0, [10, 9, 8]), (0, [11]), (1, [1, 1, 2])
]
print(sorted(lst))
印刷品:

[
    (),
    (0, [10, 9, 8]),
    (0, [11]),
    (1, []),
    (1, [1, 1, 2]),
    (2, [10, 11]),
    (2, [100]),
    (10,)
]

sort_func
返回一个元组。如果第一个元素(缺少_键)相等,则由下一个元素(字段)计算。但它首先根据丢失钥匙的数量进行排序

sorted(data,key=lambda x:x.get(“price”,0))
我还没有运行它,但是类似于此的东西应该会得到一个排序列表,这里我假设如果价格不存在,那么将
0
作为默认值,您也可以尝试使用
-1
。我在sort\u func中检查多个条件以对数据进行排序,因此我必须无论如何使用它。此外,它还可以通过多个键进行排序,不仅是“price”。
排序(data,key=lambda x:x.get(“price”,0))
我还没有运行它,但是类似于这一点的东西应该会让您得到一个排序列表,这里我假设如果价格不存在,那么将
0
作为默认值,您也可以尝试使用
-1
。我在sort\u func中检查多个条件以对数据进行排序,因此我必须无论如何使用它。此外,它还可以按多个键进行排序,而不仅仅是“price”。我在
sort\u func
中检查多个条件以对数据进行排序,因此我必须无论如何使用它。此外,它还可以按多个键进行排序,而不仅仅是“price”。我在
sort\u func
中检查多个条件以对数据进行排序,因此我必须无论如何使用它。此外,它还可以按多个键进行排序,而不仅仅是“价格”。你能解释一下丢失的键是如何影响的吗?如果解释不清楚,请在这些评论中提出更多问题。我只想通过返回丢失的键this
sort\u func
首先按数据中不包含的键数排序,然后是字段列表。因此,丢失的键最多的排序最高。所有字段的数据排序最低。你能解释一下缺少的键是如何影响的吗?如果解释不清楚,请在这些注释中提出更多问题。我只想通过返回缺少的键来了解它是如何工作的this
sort\u func
首先按不在数据中的键数排序,然后是字段列表。因此,丢失的键最多的排序最高。所有字段的数据排序最低。