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

Python:如何访问OrderedDict中的每个第k个键?,python,Python,我有一个订购信息(钥匙已订购): 我需要一个新的OrderedDict()对象,该对象包含od1的每一秒元素的key:value对。也就是说,我想要: 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,

我有一个订购信息(钥匙已订购):

我需要一个新的OrderedDict()对象,该对象包含
od1
的每一秒元素的key:value对。也就是说,我想要:

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()对象?

使用
od.items上的
itertools.islice

>>> 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]
,但是,它适用于任何iterable,不支持负步长值,并且必须使用显式
None
值,但原则相同。

od.items
上使用
itertools.islice

>>> 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]
,但是,它适用于任何iterable,不支持负步长值,并且必须使用显式
值,但原则相同。

您可以使用
枚举

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)])

您可以使用
枚举

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)])

因为您是从ordered dict开始的,所以只需使用以下代码段(Python2.7):

对于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)])

因为您是从ordered dict开始的,所以只需使用以下代码段(Python2.7):

对于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)])

od2类型是'dict',这就是为什么您得到无序的dict

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

od2类型是'dict',这就是为什么您得到无序的dict

>>> type(od2)
<class 'dict'>
输出:

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

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


您使用
od2
的示例不是如何初始化
OrderedDict
.Hmm。这在过去对我很有效。应该是什么?不,如果使用
od2={..}
,您实际上放弃了订购的dict,而是使用普通的dict。@Statssorcere不,它过去不应该对您有效。这是一个字典理解,它创建了一个
dict
对象。你以前做过
od2=orderedict()
这没关系,请注意,你可以做
od2=list()
,这没关系,Python是动态键入的。你说“它没有给我所有的键”是什么意思?你用
od2
的例子不是如何初始化
orderedict
。嗯。这在过去对我很有效。应该是什么?不,如果使用
od2={..}
,您实际上放弃了订购的dict,而是使用普通的dict。@Statssorcere不,它过去不应该对您有效。这是一个字典理解,它创建了一个
dict
对象。你以前做过
od2=OrderedDict()
这没关系,注意,你可以做
od2=list()
,这没关系,Python是动态键入的。你说“它没有给我所有的键”是什么意思?如果把
od1
作为常规的
dict
,这只是巧合(在Python3.6之前,当
OrderedDict
变得无关紧要时):使用1000到1008的键进行尝试。
od1
也需要是一个
OrderedDict
。@NathanVērzemnieks非常迂腐,
OrderedDict
在Python 3.6中仍然是相关的,因为维护插入顺序的
dict
对象仅仅是一个不应该依赖的实现细节……直到Pythonn 3.7正式成为
dict
规范的一部分。@juanpa.arrivillaga啊,谢谢你的更正;我忘记了那个细节。@ikac-不过,用
od1
作为普通字典,你的代码只是偶然的。更新。谢谢你的大开眼界!用
od1
作为常规
dict
,这只是巧合(在Python3.6之前,当
OrderedDict
变得无关紧要时):使用1000到1008的键进行尝试。
od1
也需要是一个
OrderedDict
。@NathanVērzemnieks非常迂腐,
OrderedDict
在Python 3.6中仍然是相关的,因为维护插入顺序的
dict
对象仅仅是一个不应该依赖的实现细节……直到Pythonn 3.7正式成为
dict
规范的一部分。@juanpa.arrivillaga啊,谢谢你的更正;我忘记了那个细节。@ikac-不过,用
od1
作为一个普通字典,你的代码只是偶然的。更新。谢谢你的大开眼界!这不会起作用。你正在将
dict
传递给
OrderedDict
,但是ict对象是无序的,因此,
OrderedDict
中的顺序是任意的。这不起作用。您正在将一个
dict
传递给
OrderedDict
,但是dict对象是无序的,因此,
OrderedDict
中的顺序是任意的。