使用字典(例如{'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
编辑:我的问题很独特,因为另一个问题是询问一个返回低于阈值的值列表的函数,而我的函数与阈值无关。
答案 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']
或者您可以使用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)
答案 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']
其他有用的字典迭代器是items
和values
。