在Python中访问字典中的任意元素
在Python中,当我们使用dict.keys()
方法时,会返回一个值的类型为dict_keys()
的对象。然而,如果我们尝试通过这种方式获取字典的第一个键,就会出现错误TypeError: 'dict_keys' object does not support indexing
。
为了解决这个问题,我们可以将dict.keys()
转换为列表类型,然后使用列表切片方法获取第一个成员:list(dict.keys())[0]
。这种方法在Python2和Python3中都适用,是最简单的解决方案。
然而,这个解决方案并不能回答问题的提出者想要获取值而不是键的问题。对于大多数读者来说,他们可能已经知道如何根据键从Python字典中获取相应的值。
如果我们想要获取一个任意的条目而不是任意的键,可以类似地使用list(dict.values())[0]
来实现。
但是,这种解决方案的时间复杂度是O(n)
还是O(1)
呢?我们可能会将所有n
个键转换为列表,只是为了获取第一个键。
我同意,这应该是O(n)
的。对于大量数据,我可能会考虑使用Python的迭代特性。
通过将dict.keys()
转换为列表类型,我们可以轻松地访问Python字典中的任意元素。虽然这种方法在Python2和Python3中都适用,但如果我们想要获取值而不是键,就需要使用dict.values()
并将其转换为列表类型。然而,这种方法可能会导致时间复杂度较高的问题。
在Python中访问字典中的任意元素有以下几种方法:
在Python 3中,可以使用
next(iter(mydict.values()))
非破坏性地和迭代地访问字典元素。
在Python 2中,可以使用
mydict.itervalues().next()
非破坏性地和迭代地访问字典元素。
如果想要在Python 2和3中都能正常工作,可以使用six
包:
six.next(six.itervalues(mydict))
,虽然这段代码比较晦涩,我更喜欢你的代码。
如果想要删除任意项,可以使用
key, value = mydict.popitem()
。
需要注意的是,在Python 3.6之前,"first"可能不是一个合适的术语,因为dict
在Python 3.6之前不是有序的。而在Python 3.6及以上版本,dicts
是有序的。
某些情况下了dict.iterkeys().next()
,但是问题似乎是要访问与第一个键相关联的值,所以我在回答中也是这样做的。
不幸的是,原始代码在Python 3中不起作用。
有人问这种方法在算法复杂度方面比问题中提出的方法更好,我认为这个方法的时间复杂度是O(1)
,而问题中的方法的时间复杂度是O(N)
,所以这个方法更好。
还有一个人建议将next(iter(mydict.values()))
改为mydict.values()[0]
,但是这个方法的时间复杂度是O(N)
,并不是最优的。
从Python 3.7开始,默认情况下,dict
是按插入顺序排序的。
总结一下,访问字典中的任意元素可以使用上述方法,其中next(iter(mydict.values()))
是最优的方法,时间复杂度为O(1)
。
在Python中,如果你只需要访问字典中的一个元素(由于字典不保证顺序,所以是第一个元素),你可以使用以下方法:
在Python 2中可以这样做:
my_dict.keys()[0] # "第一个"元素的键 my_dict.values()[0] # "第一个"元素的值 my_dict.items()[0] # "第一个"元素的键值对
请注意,Python不能保证连续两次调用这些方法会返回相同顺序的列表。这在Python3中不支持。
在Python 3中可以这样做:
list(my_dict.keys())[0] # "第一个"元素的键 list(my_dict.values())[0] # "第一个"元素的值 list(my_dict.items())[0] # "第一个"元素的键值对
这只适用于Python 2.x,对于Python 3.x,你必须使用list(my_dict.keys())[0]
。
那么,这是什么复杂度类呢?毫无疑问,list(my_dict.keys())[0]
不是惰性的。
需要澄清的是,我的意思是在Python 3.x中,my_dict.function()的结果不支持索引,这就是为什么首先我们必须将其转换为列表,然后我们才能使用索引[0]。
我认为这个方法的时间和空间复杂度都是线性的-非常低效。我无法想象这怎么可能是惰性的-这里有一个列表构造函数调用...这也可能适用于Python 2的解决方案,从文档中可以看出Return a copy of the dictionary’s list of values.
- 这就是为什么它在Python 3中被改变,为什么索引不再有效的原因。
我想强调一点,调用list(my_dict.keys())[0]
基本上违背了Python 3的values()
行为意图-考虑一下:for val in d.values(): break
- 在Python 3中,这是O(1),而在Python 2中,这将复制整个值列表- O(n)-只是为了丢弃它...这个答案复制整个列表只是为了得到其中一个值。
列表操作返回一个重新排序的字典键的版本,所以当你访问第一个元素时,它可能不是原始字典的第一个元素。