在Python中访问字典中的任意元素

20 浏览
0 Comments

在Python中访问字典中的任意元素

如果一个mydict不为空,我可以通过以下方式访问一个任意元素:

mydict[mydict.keys()[0]]

是否有更好的方法来实现这个操作?

0
0 Comments

在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()并将其转换为列表类型。然而,这种方法可能会导致时间复杂度较高的问题。

0
0 Comments

在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)

0
0 Comments

在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)-只是为了丢弃它...这个答案复制整个列表只是为了得到其中一个值。

列表操作返回一个重新排序的字典键的版本,所以当你访问第一个元素时,它可能不是原始字典的第一个元素。

0