Python:如何访问OrderedDict中的每个第k个键?
我有一个订购信息(钥匙已订购): 我需要一个新的OrderedDict()对象,该对象包含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,
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
中的顺序是任意的。