Python:如何访问OrderedDict中的每个第k个键?

时间:2018-02-13 19:21:38

标签: python

我有一个OrderedDict(键是有序的):

od1 = {0:10, 1:3, 2:7, 3:11, 4:30, 5:15, 6:19, 7:4, 8:3}

我想要一个新的OrderedDict()对象,它包含od1的每个第二个元素的键:值对。也就是说,我想:

od2 = {0:10, 2:7, 4:30, 6:19, 8:3}

我试过了:

od2 = OrderedDict()
od2 = {k:v for k, v in od1.items() if k % 2 == 0}

然而,这并没有给我一个有序的字典,并没有给我所有的键。相反,我得到了这个,这不是我想要的:

{0: 10, 8: 3, 2: 7, 4: 30, 6: 19}

如何获取包含每个第k个键及其相关值的新OrderedDict()对象?

5 个答案:

答案 0 :(得分:4)

itertools.islice上使用od.items

>>> od
OrderedDict([(0, 10), (1, 3), (2, 7), (3, 11), (4, 30), (5, 15), (6, 19), (7, 4), (8, 3)])

然后简单地说:

>>> from itertools import islice
>>> OrderedDict(islice(od.items(), None, None, 2))
OrderedDict([(0, 10), (2, 7), (4, 30), (6, 19), (8, 3)])

或者,例如,每隔三个键:

>>> OrderedDict(islice(od.items(), None, None, 3))
OrderedDict([(0, 10), (3, 11), (6, 19)])

islice类似于列表切片,例如。 my_list[::2]my_list[::3]但是,它适用于任何可迭代,不支持负步值,您必须使用显式None值,但原则是相同的。

答案 1 :(得分:1)

由于您从有序的dict开始,您只需使用此代码段(Python2.7):

from collections import OrderedDict

od1 = OrderedDict([(0, 10), (1, 3), (2, 7), (3, 11), (4, 30), (5, 15), (6, 19), (7, 4), (8, 3)])
c = od1.items()[::2]

print OrderedDict(c)  # OrderedDict([(0, 10), (2, 7), (4, 30), (6, 19), (8, 3)])

对于Python 3.6,它略有不同:

from collections import OrderedDict

od1 = OrderedDict([(0, 10), (1, 3), (2, 7), (3, 11), (4, 30), (5, 15), (6, 19), (7, 4), (8, 3)])
c = list(od1.items())[::2]
print(OrderedDict(c)) # OrderedDict([(0, 10), (2, 7), (4, 30), (6, 19), (8, 3)])

答案 2 :(得分:0)

您可以使用enumerate

import collections
new_d = collections.OrderedDict([a for i, a in enumerate(od1.items()) if i%2 == 0])

输出:

OrderedDict([(0, 10), (2, 7), (4, 30), (6, 19), (8, 3)])

答案 3 :(得分:0)

 od1 = {0:10, 1:3, 2:7, 3:11, 4:30, 5:15, 6:19, 7:4, 8:3}
 od2=sorted([(key,item) for key,item in od1.items() if key%2==0])
 print(od2)

输出:

 [(0, 10), (2, 7), (4, 30), (6, 19), (8, 3)]

答案 4 :(得分:-1)

od2类型是'dict',这就是你得到无序字典的原因。

>>> type(od2)
<class 'dict'>

快速解决方案将是这样的:

>>> od2 = OrderedDict({k:v for k, v in od.items() if k % 2 == 0})
>>> od2
OrderedDict([(0, 10), (2, 7), (4, 30), (6, 19), (8, 3)])