20

我有一段代码按字母顺序排列字典。有没有办法在有序字典中选择第 i 个键并返回其对应的值?IE

import collections
initial = dict(a=1, b=2, c=2, d=1, e=3)
ordered_dict = collections.OrderedDict(sorted(initial.items(), key=lambda t: t[0]))
print(ordered_dict)

OrderedDict([('a', 1), ('b', 2), ('c', 2), ('d', 1), ('e', 3)])

我想在...的脉络中发挥一些作用

select = int(input("Input dictionary index"))
#User inputs 2
#Program looks up the 2nd entry in ordered_dict (c in this case)
#And then returns the value of c (2 in this case)

如何做到这一点?谢谢。

(类似于在 ordereddict 中访问项目,但我只想输出键值对的值。)

4

5 回答 5

24

在 Python 2 中:

如果要访问密钥:

>>> ordered_dict = OrderedDict([('a', 1), ('b', 2), ('c', 2), ('d', 1), ('e', 3)])
>>> ordered_dict.keys()[2]
'c'

如果要访问该值:

>>> ordered_dict.values()[2]
2

如果您使用的是 Python 3,则可以KeysView通过将方法返回的对象keys包装为列表来转换它:

>>> list(ordered_dict.keys())[2]
'c'
>>> list(ordered_dict.values())[2]
2

不是最漂亮的解决方案,但它有效。

于 2014-03-24T13:39:37.130 回答
12

在这里使用itertools.islice是有效的,因为我们不必为了下标而创建任何中间列表。

from itertools import islice
print(next(islice(ordered_dict.items(), 2, None)))

如果你只想要价值,你可以做

print ordered_dict[next(islice(ordered_dict, 2, None))]
于 2014-03-24T13:35:50.167 回答
6

您必须使用 OrderedDict 还是只想要支持索引的类似 dict 的类型?如果是后者,那么考虑一个排序的 dict 对象。SortedDict 的一些实现(根据键排序顺序对对进行排序)支持快速第 n 个索引。例如,sortedcontainers项目有一个带有随机访问索引的SortedDict类型。

在您的情况下,它看起来像:

>>> from sortedcontainers import SortedDict
>>> sorted_dict = SortedDict(a=1, b=2, c=2, d=1, e=3)
>>> print sorted_dict.iloc[2]
'c'

如果您进行大量查找,这将比重复迭代到所需索引快得多。

于 2014-04-08T04:22:43.423 回答
1

你可以按照这些思路做一些事情(od 是有序的字典):

def get_idx(od, idx):
   from itertools import islice
   idx = (idx + len(od)) % len(od)
   t = islice(od.items(), idx, idx + 1)
   return next(t)

>>>x

OrderedDict([('a', 2), ('b', 3), ('k', 23), ('t', 41), ('q', 23)])

>>>get_idx(x, 1)
('b', 3)
>>>get_idx(x, 2)
('k', 23)
>>>get_idx(x, 4)
('q', 23)
>>>get_idx(x, -1)
('q', 23)
>>>get_idx(x, -2)
('t', 41)
于 2019-03-17T03:29:47.763 回答
0

不要小看一个普通的 'ole for循环:

from collections import OrderedDict

od=OrderedDict([('a', 1), ('b', 2), ('c', 2), ('d', 1), ('e', 3)])

def ith(od, tgt):
    for i, t in enumerate(od.items()):
        if i==tgt:
            print('element {}\'s key is "{}"'.format(i,t[0]))
            break
    else:
        print('element {} not found'.format(tgt)) 

ith(od, 2)
# element 2's key is "c"
ith(od, 20) 
# element 20 not found

这里的优点是一旦找到所需的元素,循环就会中断,如果没有找到,则返回合理的结果......

缺点是不支持相对切片。

于 2014-03-24T15:13:43.200 回答