如何在Python中按键对字典进行排序

14 浏览
0 Comments

如何在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 %}

0
0 Comments

如何在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并不能解决排序问题,因为它不关心排序,只关心添加事物的顺序。

0
0 Comments

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来保持字典的顺序。

0
0 Comments

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类,可以轻松实现字典按照键排序的功能。

0