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

如果mydict不为空,我访问一个任意的元素:

mydict[mydict.keys()[0]]

还有什么更好的办法吗?

542170 次浏览

在Python 3中,非破坏性和迭代性:

next(iter(mydict.values()))

在Python 2中,非破坏性和迭代性:

mydict.itervalues().next()

如果你想让它在python2和python3中都能工作,你可以使用six包:

six.next(six.itervalues(mydict))

虽然在这一点上,它是相当神秘的,我更喜欢你的代码。

如果你想删除任何项目,请执行以下操作:

key, value = mydict.popitem()

请注意,“first”在这里可能不是一个合适的术语,因为dict在Python <中不是一个有序类型;3.6. Python 3.6+ dicts被订购。

正如其他人提到的,没有“第一项”,因为字典没有保证的顺序(它们被实现为哈希表)。例如,如果您想要对应于最小键的值,thedict[min(thedict)]就可以做到这一点。如果你关心键被插入的顺序,也就是说,“第一个”是指“最早插入”,那么在Python 3.1中你可以使用集合。OrderedDict,这也是即将到来的Python 2.7中;对于较旧版本的Python,请下载、安装并使用有序的dict backport(2.4及更高版本),您可以找到在这里

< >强Python 3.7 现在字典的插入顺序

忽略字典排序的问题,这样可能会更好:

next(dict.itervalues())

这样就避免了项查找和生成不使用的键的列表。

Python3

next(iter(dict.values()))

你可以做:

for k in sorted(d.keys()):
print d[k]

这将为您提供一个一致排序的键集(我猜是相对于内装式.hash()),如果排序对您有任何意义,您可以对其进行处理。这意味着,例如,即使扩展字典,数值类型也会保持一致排序。

例子

# lets create a simple dictionary
d = {1:1, 2:2, 3:3, 4:4, 10:10, 100:100}
print d.keys()
print sorted(d.keys())


# add some other stuff
d['peter'] = 'peter'
d['parker'] = 'parker'
print d.keys()
print sorted(d.keys())


# some more stuff, numeric of different type, this will "mess up" the keys set order
d[0.001] = 0.001
d[3.14] = 'pie'
d[2.71] = 'apple pie'
print d.keys()
print sorted(d.keys())

请注意,字典在打印时是排序的。但是键集本质上是一个hashmap!

如果你只需要访问一个元素(偶然是第一个,因为字典不保证排序),你可以简单地在Python 2中这样做:

my_dict.keys()[0]    # key of "first" element
my_dict.values()[0]  # value of "first" element
my_dict.items()[0]   # (key, value) tuple of "first" element

请注意(据我所知)Python不能保证连续两次调用这些方法中的任何一个都会返回相同顺序的list。Python3不支持这一点。

在# EYZ0:

list(my_dict.keys())[0]    # key of "first" element
list(my_dict.values())[0]  # value of "first" element
list(my_dict.items())[0]   # (key, value) tuple of "first" element

在python3中,方法是:

dict.keys()

返回一个类型为:dict_keys()的值,当获取dict的key的第一个成员时,我们将得到一个错误:

dict.keys()[0]
TypeError: 'dict_keys' object does not support indexing

最后,我将dict.keys()转换为list @1st,并通过列表拼接方法获得了第一个成员:

list(dict.keys())[0]

对于Python 2和3:

import six


six.next(six.itervalues(d))

在python3

list(dict.values())[0]

这个怎么样。这里还没有提到。

Py 2 &3.

a = {"a":2,"b":3}
a[list(a)[0]] # the first element is here
>>> 2

为了得到钥匙

next(iter(mydict))

得到一个值

next(iter(mydict.values()))

两者兼得

next(iter(mydict.items())) # or next(iter(mydict.viewitems())) in python 2

前两个是Python 2和3。后两个在python3中是lazy,但在python2中不是。

没有外部库,适用于Python 2.7和3.x:

>>> list(set({"a":1, "b": 2}.values()))[0]
1

对于任意键,省略.values()

>>> list(set({"a":1, "b": 2}))[0]
'a'

子类化dict是一种方法,尽管效率不高。在这里,如果你提供一个整数,它将返回d[list(d)[n]],否则按预期访问字典:

class mydict(dict):
def __getitem__(self, value):
if isinstance(value, int):
return self.get(list(self)[value])
else:
return self.get(value)


d = mydict({'a': 'hello', 'b': 'this', 'c': 'is', 'd': 'a',
'e': 'test', 'f': 'dictionary', 'g': 'testing'})


d[0]    # 'hello'
d[1]    # 'this'
d['c']  # 'is'
first_key, *rest_keys = mydict

另一种方法是在一行中做到这一点,同时保持字典的完整性:

arbitrary_value = mydict.setdefault(*mydict.popitem())

popitem()返回一个(key, value)的元组,用于添加到字典中的最后一项,这个元组作为位置参数传递给setdefaultsetdefault尝试将key插入到mydict中,如果它不存在,则值为value,但如果存在则不执行任何操作;然后将该键的值返回给调用者。因为我们已经从字典中弹出了(key, value)对,我们通过setdefault将它插入到字典中,然后继续返回value,这是我们想要的。