1

假设有一本字典

foo = {'b': 1,  'c':2,  'a':3 }

我想按照字典中项目出现的顺序遍历这个字典。

for k,v in foo.items():
    print k, v

印刷

a 3
c 2
b 1

如果我们使用 sorted() 函数:

for k,v in sorted(foo.items()):
    print k, v

印刷

a 3
b 1
c 2

但我需要它们按照它们在字典中出现的顺序,即

b 1
c 2
a 3

我如何做到这一点?

4

7 回答 7

11

字典没有顺序。如果你想这样做,你需要在你的原始列表中找到一些排序方法。或者,将键按保存顺序保存在列表中,然后使用它们作为键访问字典。

来自Python 文档

最好将字典视为一组无序的键:值对,并要求键是唯一的(在一个字典中)。

例子 -

>>> testList = ['a', 'c', 'b']
>>> testDict = {'a' : 1, 'c' : 2, 'b' : 3}
>>> for elem in testList:
        print elem, testDict[elem]


a 1
c 2
b 3

或者更好的是,使用OrderedDict-

>>> from collections import OrderedDict
>>> testDict = OrderedDict([('a', 1), ('c', 2), ('b', 3)])
>>> for key, value in testDict.items():
        print key, value


a 1
c 2
b 3
于 2013-07-17T18:11:28.107 回答
2

必须使用有序字典来记住它们的存储顺序

>>>from collections import OrderedDict
>>>od = OrderedDict()
>>>od['b'] = 1
>>>od['c'] = 2
>>>od['a'] = 3
>>>print od
OrderedDict([('b',1), ('c',2), ('a',3)]
于 2013-07-17T18:13:40.767 回答
2

也许这个?

sorted(foo, key=foo.get)
于 2013-07-17T18:14:01.750 回答
2

如果您想多次使用 OrderedDict,请像人们所说的那样使用 OrderedDict。:) 如果您只想要一次性的单线,请更改您的排序功能:

sorted(foo.items(), lambda a,b:a[1]-b[1])
于 2013-07-17T18:21:49.280 回答
2

您可以通过单线做到这一点:

>>> sorted(foo.items(), key=lambda x: x[1])
[('b', 1), ('c', 2), ('a', 3)]
于 2013-07-17T18:27:06.213 回答
1

如果您只想按键对它们进行排序,请执行以下操作:

sorted_by_keys_dict = dict((y,x) for x,y in foo.iteritems())
for k,v in sorted(sorted_by_keys_dict.items()):
    print v, k

a 1
c 2
b 3

或者简单地说:

for k,v in sorted(dict((y,x) for x,y in foo.iteritems()).items()):
    print v, k

a 1
c 2
b 3
于 2013-07-17T18:13:58.290 回答
1

更直接地看到这个,你用来创建字典的顺序不是字典的顺序。顺序不确定。

>>> {'b': 1,  'c':2,  'a':3 }
{'a': 3, 'c': 2, 'b': 1}
于 2013-07-17T18:16:02.240 回答