从Python字典中提取第n个键?

27

给定一个Python字典和一个整数n,我需要访问第n个键。在我的项目中,我需要多次重复执行此操作。

我已经写了一个能够实现此功能的函数:

def ix(self,dict,n):
    count=0
    for i in sorted(dict.keys()):
        if n==count:
            return i
        else:
            count+=1

问题在于如果字典很大,重复使用时时间复杂度会增加。

有没有一种有效的方法来解决这个问题呢?


17
在无序集合中,没有类似于“第n个元素”的概念。我认为您表述问题的方式有误。 - Elazar
@jamylak 是的,谢谢!我不知道即使没有 .keys() 也可以进行迭代,那么主要问题有解决方案吗? - Hemanth Malla
你实际想要解决的问题是什么?从概念上讲,“字典的第n个键”是没有意义的,正如其他一些人所指出的那样。你可能正在遭受XY问题的困扰。 - Zero Piraeus
2
使用有序字典和答案中描述的方法。 - Elazar
2
@Elazar:从Python 3.6/3.7开始,您不再需要OrderedDict,字典保证插入顺序(并且在3.7中作为语言特性)。 - smci
显示剩余3条评论
4个回答

16

我猜你想做这样的事情,但是由于字典没有任何顺序,所以dict.keys中键的顺序可以是任意的:

def ix(self, dct, n): #don't use dict as  a variable name
   try:
       return list(dct)[n] # or sorted(dct)[n] if you want the keys to be sorted
   except IndexError:
       print 'not enough keys'

谢谢@Ashwini,所以Python内部会创建一个包含字典中所有键的列表,对吗? - Hemanth Malla
@HemanthMalla 不,Python字典是作为哈希表实现的。http://docs.python.org/2/faq/design.html#how-are-dictionaries-implemented - Ashwini Chaudhary
1
我们真的需要创建一个全新的列表来访问一个元素吗? - normanius
字典在3.6版本之后具有顺序,这是自3.7版本以来的语言特性。 - BadZen

15

dict.keys() 返回一个列表,所以你只需要使用 dict.keys()[n]

但是,字典是一个无序集合,因此在这个上下文中找到第n个元素没有任何意义。

注意:在Python3中不支持对 dict.keys() 进行索引


8
它是Python3中的一个可迭代对象。 - Elazar
哎呀...我真的需要升级了,这是我今天第二次纠正Python3的错误 :) - shyam
在Python3中支持dict.keys(),但不支持dict.keys()[n]。 - shiftyscales

8

对于那些想要避免创建一个新的临时列表来访问第n个元素的人,我建议使用迭代器。

from itertools import islice
def nth_key(dct, n):
    it = iter(dct)
    # Consume n elements.
    next(islice(it, n, n), None) 
    # Return the value at the current position.
    # This raises StopIteration if n is beyond the limits.
    # Use next(it, None) to suppress that exception.
    return next(it)

与先将键转换为临时列表再访问其第n个元素相比,对于非常大的字典来说,这种方法可以显著提高速度。


你可以使用 next(islice(it, n, n+1)) 在一行中完成相同的操作。 - raphael
2
@raphael 如果目标是将代码写在一行中,可以使用 next(islice(iter(dict), n, n+1)) - normanius

2

在多个答案中提到,字典是无序的。这只适用于Python 3.6及以下版本。从3.7开始,字典实际上是有序的。


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