我有一个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()对象?
答案 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)])