2013-02-13 170 views
25

我在Python的字典,这些看起来像这样:迭代通过按键Python字典的排序顺序

D = {1:'a', 5:'b', 2:'a', 7:'a'} 

键的值大多是不相关的。有没有办法按数字顺序按键遍历字典?钥匙都是整数。

与其说

for key in D: 
    # code... 

我可以顺利通过的顺序1,2,5,7字典键?感谢您的帮助提前。

此外,我不能使用排序/排序功能。

+1

的可能的复制(HTTP [在Python,我怎么遍历在有序字典?]:/ /stackoverflow.com/questions/364519/in-python-how-do-i-iterate-over-a-dictionary-in-sorted-order) – 2016-07-24 22:50:03

回答

32

您可以使用此:

for key in sorted(D.iterkeys()): 
    .. code .. 

在Python 3.x中,使用D.keys()(与Python 2.x中的D.iterkeys()相同)。

+0

有没有办法做到这一点,而不使用显式的排序功能?这是挑战的一部分,我们必须在不使用排序功能的情况下对所有内容进行排序。对不起,我应该早些提到这一点。 – ben 2013-02-13 21:35:58

+0

谢谢!太棒了。 – ben 2013-02-13 21:39:42

+0

最后一件事。你知道任何其他方式来通过键排序吗?我非常感谢你的帮助。 – ben 2013-02-13 21:51:04

1

你可以使用dict.keys()键的列表,然后遍历列表的排序视图:

for key in sorted(D.keys()): 
    print key, D[key] 
+0

有没有办法做到这一点,而不明确使用排序功能?这是挑战的一部分,我们必须在不使用排序功能的情况下对所有内容进行排序。对不起,我应该早些提到这一点。 – ben 2013-02-13 21:36:40

+0

@ben。那么你将不得不编写自己的排序逻辑。但你为什么要重新发明轮子? – 2013-02-13 21:37:56

+0

通常是因为有人为他的CS作业使用堆栈溢出。 – 2017-09-26 18:14:22

7

考虑到您不想排序的规定,并且假设键都是整数,您可以简单地找到键的最大值和最小值,然后遍历该范围并检查每个键是否实际在字典里。

for key in xrange(min(D), max(D) + 1): 
    if key in D: 
     print D[key] 

这是不是很有效,当然,但它工作,它避免了排序。

+0

这是一个聪明的黑客。但是,如果字典中只有2个键,'1'和'1000000'?说啥? – 2013-02-13 21:43:57

+0

是的,排序绝对更好! – kindall 2013-02-13 21:45:09

+2

这仍然给OP确切的他想要的。 – 2013-02-13 21:46:16

6

假设键/值插入顺序,您可以使用OrderedDict

>>> from collections import OrderedDict 
>>> d = OrderedDict() 
>>> d[1] = 'a' 
>>> d[2] = 'a' 
>>> d[5] = 'b' 
>>> d[7] = 'a' 
>>> d 
OrderedDict([(1, 'a'), (2, 'a'), (5, 'b'), (7, 'a')]) 
>>> d.keys() 
[1, 2, 5, 7] 
+0

如果您不想更改现有字典,只需为您的有序字典建立一个临时变量,并将其设置为来自集合的OrderedDict(D) >>> import a OrderedDict >>> a = {'a':' A','b':'B','c':'C'} >>> OrderedDict(a) returns - > OrderedDict([('a','A'),('b',' B'),('c','C')]) – 2015-06-19 17:52:08