如何在Python中获取OrderedDict的前三个元素?

17

如何在Python的OrderedDict中获取前3个元素?

另外,是否可以从该字典中删除数据?

例如:如何获取Python的OrderedDict中的前3个元素并删除其余元素?

3个回答

33

让我们创建一个简单的OrderedDict

>>> from collections import OrderedDict
>>> od = OrderedDict(enumerate("abcdefg"))
>>> od
OrderedDict([(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd'), (4, 'e'), (5, 'f'), (6, 'g')])

要返回前三个,请分别执行以下操作:

>>> list(od)[:3]
[0, 1, 2]
>>> list(od.values())[:3]
['a', 'b', 'c']
>>> list(od.items())[:3]
[(0, 'a'), (1, 'b'), (2, 'c')]

仅保留前三个项目:

>>> while len(od) > 3:
...     od.popitem()
... 
(6, 'g')
(5, 'f')
(4, 'e')
(3, 'd')
>>> od
OrderedDict([(0, 'a'), (1, 'b'), (2, 'c')])

1
.items().values()在Python 2.7中返回列表,因此无需使用list()。在Python 3中是否有所不同? - John
1
@John 是的。我选择不复杂化答案,因为在2.x中返回列表:这里没有实际影响,在任何情况下,每个人现在都应该以3.x为目标编写代码(即使他们的代码尚未针对它)。 - Zero Piraeus
1
值得注意的是,OrderedDict(list(od.items())[:3]) 将以一行代码的形式返回一个仅包含前三个项目的字典。 - cjbarth

3
您可以使用这个迭代方法来完成工作。
x = 0
for i in ordered_dict:
    if x > 3:
        del ordered_dict[i]
    x += 1

首先,您需要创建一个计数器变量x并将其赋值为0。然后,您循环使用ordered_dict中的键。通过检查x是否大于3(即您想要的值的数量),您可以知道已经检查了多少个项目。如果已经检查了3个项目,则从ordered_dict中删除该项目。

以下是一种更清晰简洁的方法(感谢评论)。
for i, k in enumerate(ordered_dict):
    if i > 2:
        del ordered_dict[k]

这个方法使用enumerate为每个键分配一个数字。然后它检查该数字是否小于两个(0、1或2)。如果数字不是0、1或2(这将是前三个元素),那么字典中的该项将被删除。


啊,我明白你的意思了。我的错。你可以在这里使用enumerate - kindall
没关系,但是枚举更好。 - Shashank
类似这样的代码:for i, k in enumerate(odct): if i > 2: del odct[k]。当然,不能写在一行,否则会出现语法错误 :p - Shashank
请注意,此解决方案在Python3中会失败,并出现n个RuntimeError,因为在迭代过程中不允许更改字典的大小。 - mutableVoid

2

这与其他字典没有区别:

d = OrderedDict({ x: x for x in range(10) })

i = d.iteritems()
a = next(i)
b = next(i)
c = next(i)

d = OrderedDict([a,b,c])
# or
d.clear()
d.update([a,b,c])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接