Jus*_*tin 19 python sorting dictionary
这是字典看起来像:
{'57481': 50, '57480': 89, '57483': 110, '57482': 18, '57485': 82, '57484': 40}
Run Code Online (Sandbox Code Playgroud)
我想按数字顺序对字典进行排序,结果应该是:
{'57480': 89, '57481': 50, '57482': 18, '57483': 110, '57484': 40, '57485': 82}
Run Code Online (Sandbox Code Playgroud)
我试过sorted(self.docs_info.items)但它不起作用.
Hen*_*ter 18
如果你只需要按键排序,那么你已经有了95%.假设您的字典似乎被调用docs_info:
for key, value in sorted(docs_info.items()): # Note the () after items!
print(key, value)
Run Code Online (Sandbox Code Playgroud)
由于字典键总是唯一的,调用sorted上docs_info.items()(这是元组序列)等效于仅由键排序.
请记住,包含数字的字符串排序不直观!例如"11"比"小" "2".如果您需要按数字排序,我建议使用键int而不是str; 例如
int_docs_info = {int(k) : v for k, v in docss_info.items()}
Run Code Online (Sandbox Code Playgroud)
这当然只是改变了访问字典元素的顺序,这通常就足够了(因为如果你没有访问它,那么如果它被排序了又有什么关系?).如果由于某种原因你需要将dict本身"排序",那么你将不得不使用collections.OrderedDict,它会记住项目插入其中的顺序.所以你可以先对你的字典进行排序(如上所述),然后OrderedDict从排序的(键,值)对中创建一个:
sorted_docs_info = collections.OrderedDict(sorted(docs_info.items()))
Run Code Online (Sandbox Code Playgroud)
标准Python dicts是"无序的".你可以使用OrderedDict,看看文档:
from collections import OrderedDict
d = {'57481': 50, '57480': 89, '57483': 110, '57482': 18, '57485': 82, '57484': 40}
OrderedDict(sorted(d.items(), key=lambda t: t[0]))
# OrderedDict([('57480', 89), ('57481', 50), ('57482', 18), ('57483', 110), ('57484', 40), ('57485', 82)])
Run Code Online (Sandbox Code Playgroud)
如果重复排序元素并将它们插入有序的dict中太慢,请考虑PyPI上的一个已排序的dict实现.一个SortedDict数据类型有效地维持有序的钥匙.该sortedcontainers模块包含一个这样的实现.
从PyPI安装很简单:
pip install sortedcontainers
Run Code Online (Sandbox Code Playgroud)
如果你不能,pip install那么只需从开源存储库中复制sortedlist.py和sorteddict.py文件.SortedContainers在纯Python中实现,但是快速实现.
一旦安装简单:
In [1]: from sortedcontainers import SortedDict
In [6]: SortedDict({'57481': 50, '57480': 89, '57483': 110, '57482': 18, '57485': 82, '57484': 40})
Out[6]: SortedDict({'57480': 89, '57481': 50, '57482': 18, '57483': 110, '57484': 40, '57485': 82})
Run Code Online (Sandbox Code Playgroud)
sortedcontainers模块还维护了几个流行实现的性能比较.
| 归档时间: |
|
| 查看次数: |
41506 次 |
| 最近记录: |