如何创建按降序排列的键列表

时间:2019-04-04 01:45:48

标签: python python-3.x dictionary python-3.7

使用字典(例如{'aa':3.0,'bb':1.2,'ab':3.0,'cd':6.0}),我想根据以下内容以降序返回键列表他们的价值观。如果两个或多个键具有相同的值,则将根据键的字母顺序对值进行排序。以上一个字典为例,我希望函数返回: ['cd','aa','ab','bb']。

我曾考虑过创建一个辅助函数来创建键及其对应值的并行列表,以实现我想要的功能,但是我无法实现这一点。我在下面编写了代码的非常基本的概述:

def f(d: Dict[str, float]) -> List[str]:

    accumulator_list = []

    # do something

    return accumulator_list

编辑:我的问题很独特,因为另一个问题是询问一个返回低于阈值的值列表的函数,而我的函数与阈值无关。

4 个答案:

答案 0 :(得分:0)

首先按字母顺序对键进行排序,然后按其值的相反顺序对其进行排序。因为Python排序是稳定的,所以当键的值相同时,这将使键保持字母顺序:

def f(d):
    keys = sorted(d)
    keys = sorted(keys, key=lambda k: d[k], reverse=True)
    return keys

d = {'aa': 3.0, 'bb': 1.2, 'ab': 3.0, 'zz': 6.0, 'cd': 6.0}
print(f(d))

输出:

['cd', 'zz', 'aa', 'ab', 'bb']

从排序文档中:https://docs.python.org/3/howto/sorting.html#sort-stability-and-complex-sorts

答案 1 :(得分:0)

这是itemgetter()的绝佳用例:

from operator import itemgetter

d = {'aa': 3.0, 'bb': 1.2, 'ab': 3.0, 'cd': 6.0}

tups = list(d.items())
tups.sort(key = itemgetter(0))                   # Sort by keys.
tups.sort(key = itemgetter(1), reverse = True)   # Sort by vals, reversed.
keys = list(map(itemgetter(0), tups))

print(keys)

答案 2 :(得分:0)

您可以创建具有诸如(-3.0, 'aa')之类的元组的列表-值首先为减号,因此它将按值降序和键升序排序。

然后您可以使用sorted()

对其进行排序
data = {'aa': 3.0, 'bb': 1.2, 'ab': 3.0, 'cd': 6.0}

new = [(-value, key) for key, value in data.items()]
new = sorted(new)
new = [key for value, key in new]

print(new)

['cd', 'aa', 'ab', 'bb']

或者您可以使用sortedkey=中直接做同样的事情

data = {'aa': 3.0, 'bb': 1.2, 'ab': 3.0, 'cd': 6.0}

new = sorted(data.items(), key=lambda x: (-x[1], x[0]))
new = [key for key, value in new]

print(new)

一行

data = {'aa': 3.0, 'bb': 1.2, 'ab': 3.0, 'cd': 6.0}

new = [key for key, value in sorted(data.items(), key=lambda x: (-x[1], x[0]))]

print(new)

答案 3 :(得分:0)

看看this

字典有一个称为keys的方法,该方法返回带有键的迭代器。您可以使用sorted从迭代器中获取排序列表。

在您的示例中:

d = {'aa': 3.0, 'bb': 1.2, 'ab': 3.0, 'cd': 6.0}
l = sorted(d.keys()) # l = ['aa','ab','bb','cd']

其他有用的字典迭代器是itemsvalues