如何在Python中按键对字典进行排序
如何在Python中按键对字典进行排序
有人能告诉我如何对这个进行排序吗:
{'a': [1, 2, 3], 'c': ['one', 'two'], 'b': ['blah', 'bhasdf', 'asdf'], 'd': ['asdf', 'wer', 'asdf', 'zxcv']}
排序后的结果应该是:
{'a': [1, 2, 3], 'b': ['blah', 'bhasdf', 'asdf'], 'c': ['one', 'two'], 'd': ['asdf', 'wer', 'asdf', 'zxcv']}
谢谢!
更新1,代码示例:
我在做语言学研究。一篇文章被分解成单词并存储在数据库中,具有各种属性,包括段落ID和句子ID。任务:尝试重建原始文本。
从数据库中获取500个连续的单词
words = Words.objects.all()[wordId:wordId+500]
# 首先创建段落,以便稍后可以在django模板中循环,
# 每个段落中将包含一个单词列表(也是字典)。
# 所以我试图获得一个值为列表的字典。
# 'pp'只是为了缩写一个长命名的变量。
paras={}
para_high = para_low = words[0].belongs_to_paragraph
for w in words:
last_word = w
pp = w.belongs_to_paragraph
if pp >para_high:
para_high = pp
if pp < para_low:
para_low = pp
if pp in paras:
paras[pp].append(w)
else:
list = [w]
paras[pp] = list
# 由于段落之间有空行,在重建原始文本时,我需要插入空行。
# 由于我有段落的ID,并且它们有点像这样:1,3,4,8,9
# (我必须用其他东西填充1和3之间以及4和8之间的间隙,
# 这就是为什么我需要用para_low和para_high来循环范围。
isbr = True
for i in range(para_low, para_high+1):
if i in paras:
isbr = True
else:
if isbr:
paras[i]=['break']
isbr = False
else:
paras[i]=[]
然而,在这一点上,如果我尝试循环字典并重建文本,一些较晚的ID段落会出现在之前的段落之前,这就不行了。
更新2,循环代码:
{% for k,v in wording.iteritems() %}
{% if v[0] == 'break' %}
{% else %}
{% for word in v %}{% if word.special==0%} {% endif %}{{ word.word }}{% endfor %}
{% endif %}
{% endfor %}
如何在Python中按键排序字典
问题出现的原因是,希望按照键的顺序对字典进行排序,但是普通的字典并没有内置的排序功能。解决方法是使用sorted()函数在循环遍历字典时进行排序。
以下是解决方法的示例代码:
for k, v in sorted(d.items()): print k, ':', v 或者 for k in sorted(d): print d[k]
或类似的方法。
有人可能会提到OrderedDict,但是OrderedDict并不是用于排序的字典,而是用于具有某种顺序的字典。顺序和排序是不同的概念。可以创建一个有序的OrderedDict,但是一旦添加了新的键,它就不再是有序的。因此,在每次使用或修改之前,仍然需要使用sorted()来对其进行排序。OrderedDict只是比普通字典更慢且占用更多内存,而没有提供任何必要的功能。
OrderedDict适用于希望按照添加顺序显示条目的字典,或者希望用户能够任意排序条目的字典。
为什么OrderedDict不是解决方案呢?因为OrderedDict是有序的而不是排序的。考虑一个普通字典:
d = {'a': 0, 'b': 1, 'c': 2, 'd': 3, 'e': 4, 'f': 5}
它并没有排序,如下所示,'c'将在'b'之前。它也没有顺序,如果添加新的键,它们似乎以随机顺序出现:
d['g'] = 6 d['i'] = 8 print(d) # {'a': 0, 'c': 2, 'b': 1, 'e': 4, 'd': 3, 'g': 6, 'f': 5, 'i': 8}
好吧,那么让我们使用OrderedDict:
o = OrderedDict(sorted(d.items())) print(o) # OrderedDict([('a', 0), ('b', 1), ('c', 2), ('d', 3), ('e', 4), ('f', 5)])
哈!排序了!因此OrderedDict管用了吗?不是的。
o['i'] = 8 o['g'] = 6 print(o) # OrderedDict([('a', 0), ('b', 1), ('c', 2), ('d', 3), ('e', 4), ('f', 5), ('i', 8), ('g', 6)])
什么?'g'出现在'i'之后?为什么?因为OrderedDict不是排序的,它是有序的。它记住你添加事物的顺序,而不是排序。这意味着每次使用之前都需要对其进行排序。只要向其中添加键,OrderedDict就不再保持排序。但是,如果你不打算修改它,那么你根本不需要一个字典,可以使用列表,这正是sorted()函数返回的结果。
因此,每次想要以排序方式循环遍历字典时,都需要使用sorted()函数:
for k in sorted(o): print(k, o[k])
这适用于任何类型的字典。OrderedDict实际上并没有帮助你,因为它并不关心排序,只关心你添加事物的顺序。
结论:每次想要以排序方式循环遍历字典时,都需要使用sorted()函数,不论使用哪种类型的字典。使用OrderedDict并不能解决排序问题,因为它不关心排序,只关心添加事物的顺序。
Python中的字典(dict)没有顺序。虽然可以使用sorted函数对字典的键进行排序,但返回的只是一个排序过的键的列表,并不能得到一个有序字典。可以将字典视为可迭代对象,对键值对进行排序,但这只会得到一个由元组组成的列表,仍然不是一个字典。
如果使用的是Python 2.7或更高版本,可以考虑使用collections模块中的OrderedDict。OrderedDict是一个字典的子类,可以记住键值对添加的顺序。
例如,可以使用以下代码创建一个有序字典:
import collections d = {'a': [1, 2, 3], 'b': ['blah', 'bhasdf', 'asdf'], 'c': ['one', 'two'], 'd': ['asdf', 'wer', 'asdf', 'zxcv']} d = collections.OrderedDict(sorted(d.items())) for k, v in d.items(): print(k, v)
输出结果为:
a [1, 2, 3] b ['blah', 'bhasdf', 'asdf'] c ['one', 'two'] d ['asdf', 'wer', 'asdf', 'zxcv']
然而,如果使用的是Python 2.6或更早的版本,就无法使用OrderedDict。在这种情况下,可以考虑使用其他的用户自定义解决方案。
可以通过调用sorted()函数对字典的键进行排序来得到一个排序过的字典。如果需要保持字典的顺序,可以使用collections模块中的OrderedDict。
总之,问题的原因是Python中的普通字典(dict)没有顺序的概念,并且没有内置函数可以对其进行排序。解决方法是使用sorted()函数对字典的键进行排序,或者使用collections模块中的OrderedDict来保持字典的顺序。
Python中有多种字典实现方式,可以保持键按照排序顺序排列。例如,可以使用sortedcontainers模块来实现字典排序。sortedcontainers是一个纯Python且速度快的实现。该模块与其他快速和功能齐全的实现进行了性能比较。
可以使用sortedcontainers模块的SortedDict类来对字典按键进行排序。下面是一个示例代码:
from sortedcontainers import SortedDict d = {'a': [1, 2, 3], 'c': ['one', 'two'], 'b': ['blah', 'bhasdf', 'asdf'], 'd': ['asdf', 'wer', 'asdf', 'zxcv']} s = SortedDict(**d) print(s.keys())
执行以上代码,将输出键按照排序顺序排列的结果:`SortedSet(['a', 'b', 'c', 'd'])`。
除了使用SortedDict类对字典进行排序,还可以完全替换掉原有的dict使用SortedDict。SortedDict支持快速的获取/设置操作,并能按照键的顺序进行迭代。
以上就是如何在Python中按照键对字典进行排序的方法。通过使用sortedcontainers模块的SortedDict类,可以轻松实现字典按照键排序的功能。