使用字典(例如{'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
编辑:我的问题是独特的,因为另一个问题是询问一个函数返回低于阈值的值列表,而我的函数与阈值无关。
您可以使用(-3.0, 'aa')
这样的元组创建列表 - 值为first,使用minus,因此它将按值降序和按键升序排序。
然后你可以使用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']
或者你可以使用sorted
直接在key=
做同样的事情
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)
首先按字母顺序对键进行排序,然后按其值的相反顺序对它们进行排序。因为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
这是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)
字典有一个名为keys
的方法,它返回带有键的迭代器。您可以使用sorted
从迭代器中获取排序列表。
在你的例子中:
d = {'aa': 3.0, 'bb': 1.2, 'ab': 3.0, 'cd': 6.0}
l = sorted(d.keys()) # l = ['aa','ab','bb','cd']
其他有用的字典迭代器是items
和values
。