[英]What is the most pythonic way to sort a dict with list values?
我正在创建一个值作为整数列表的字典。 对每个键的值进行排序的pythonic方法是什么? 在我的方法中,我在排序后覆盖每个键值。
有没有办法在插入字典时保持排序,还是先存储然后对值进行高效排序更好?
my_dict = {
'first': [3,6,99],
'second': [1,-10,100],
'third': [5,0,23,67,29]
}
# my approach
for key, values in my_dict.items():
my_dict[key] = sorted(values)
输出:
my_dict = {
'first': [3,6,99],
'second': [-10,1,100],
'third': [0,5,23,29,67]
}
pythonic 代码利用诸如列表推导式或生成器表达式之类的编程模式,尝试在 C 或 java 中更常用的模式中使用撬棍。 循环是 this 中特别常见的例子。Pythonic 代码也使用了 PEP20 提到的内联语法( Beautiful is better than ugly.
Flat is better than nested.
)
首先,您的代码很好,但要更加 Python 化,您应该使用诸如列表解析/字典解析之类的语法。 我将介绍最有效的方法,它使用最少的代码行使用 for 循环的 dict comprehension instaed,使其更加 Pythonic,即使 for 循环被认为是 pyhonic list & dict comprehensions 更 Pythonic(它们是扁平语法)。
这是代码:
my_dict = {
'first': [3,6,99],
'second': [1,-10,100],
'third': [5,0,23,67,29]
}
sorted_dict = {key:sorted(value) for key, value in my_dict.items()}
print(sorted_dict)
输出:
{'first': [3, 6, 99], 'second': [-10, 1, 100], 'third': [0, 5, 23, 29, 67]}
本地排序不需要再次为键赋值。
import random
import time
from copy import deepcopy
def time_it(func):
def inner():
start = time.time()
func()
end = time.time()
print('time used:{} second'.format(end - start))
return inner
def random_l(n):
return [random.randint(0, 100) for _ in range(n)]
my_dict = {
'first': random_l(5),
'second': random_l(5),
'third': random_l(5)
}
my_dict1 = deepcopy(my_dict)
my_dict2 = deepcopy(my_dict)
@time_it
def foo():
print(my_dict1)
for key, values in my_dict1.items():
my_dict1[key] = sorted(values)
print(my_dict1)
@time_it
def bar():
print(my_dict2)
for key, values in my_dict2.items():
sorted(my_dict2[key])
print(my_dict2)
if __name__ == '__main__':
foo()
bar()
{'first': [28, 96, 52, 57, 93], 'second': [17, 89, 76, 30, 36], 'third': [73, 32, 9, 90, 81]}
{'first': [28, 52, 57, 93, 96], 'second': [17, 30, 36, 76, 89], 'third': [9, 32, 73, 81, 90]}
time used:5.3882598876953125e-05 second
{'first': [28, 96, 52, 57, 93], 'second': [17, 89, 76, 30, 36], 'third': [73, 32, 9, 90, 81]}
{'first': [28, 96, 52, 57, 93], 'second': [17, 89, 76, 30, 36], 'third': [73, 32, 9, 90, 81]}
time used:1.621246337890625e-05 second
如果你想要sortedList
sortedcontainers 之类的功能方便,也可以使用bitsect模块的 insort 功能
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.