我有一段代码按字母顺序排序字典。 有没有办法在有序字典中选择第i个键并返回其相应的值?即。
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)
如何实现这一目标? 感谢。
(与Accessing Items In a ordereddict类似,但我只想输出键值对的值。)
答案 0 :(得分:19)
在Python 2中:
如果您想访问密钥:
>>> 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
不是最漂亮的解决方案,但它确实有效。
答案 1 :(得分:12)
使用itertools.islice
在这里很有效,因为我们不必为了下标而创建任何中间列表。
from itertools import islice
print(next(islice(ordered_dict.items(), 2, None)))
如果您只想要该值,则可以
print ordered_dict[next(islice(ordered_dict, 2, None))]
答案 2 :(得分:5)
你是否必须使用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'
如果你进行了大量的查找,这将比反复迭代到所需的索引更快很多。
答案 3 :(得分: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
这里的优点是,一旦找到所需的元素,循环就会中断,如果没有找到,则返回合理的结果......
缺点是不支持相对切片。
答案 4 :(得分:0)
您可以按照以下方式进行操作(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)