如果我知道我的词典总是只有一个元素,那么有没有办法在不经过列表的情况下提取密钥名称?我现在这样做。
data = {'foo': [1, 2, 3]}
key_name = data.keys()[0]
是否有更有效的技术?
答案 0 :(得分:4)
迭代字典产生密钥。
>>> data = {'foo': [1, 2, 3]}
>>> next(iter(data))
'foo'
基准:
In [1]: data = {'foo': [1, 2, 3]}
In [2]: %timeit next(iter(data))
1000000 loops, best of 3: 197 ns per loop
In [3]: %timeit data.keys()[0]
10000000 loops, best of 3: 155 ns per loop
In [4]: %timeit data.iterkeys().next()
1000000 loops, best of 3: 226 ns per loop
In [9]: %timeit k, = data.keys()
10000000 loops, best of 3: 151 ns per loop
In [10]: %timeit k, = data # <--- fastest
10000000 loops, best of 3: 81.4 ns per loop
答案 1 :(得分:2)
使用iterkeys
:
data.iterkeys().next()
'foo'
假设您正在使用python 2
适用于python2
或python 3
k, = data.keys()
print (k)
'foo'
答案 2 :(得分:1)
假设您在某些时候也需要这个值,那么最多的&#34; pythonic&#34;并且可靠的方法可能是使用 try ... except 块,如下所示:
data = {'foo': [1, 2, 3]}
try:
key, value = data.items()[0]
except IndexError:
raise Exception("Your dictionary didn't have the element you thought it had")
在这里,您只需将字典转换为2元组列表(使用items
)并选择其中的第一个字符,即可找到没有项目的情况。如果字典确实有多个项目,则可能会返回任何 key:value 对,并且您的结果将是不确定的。
在不讨论您的具体用例的情况下 - 您显然比我更熟悉 - 值得指出的是,即使您希望数据结构具有特定内容,也几乎总会有边缘如果这种假设是错误的并且优雅地处理这些异常将会产生更强大的代码。
此代码应该在Python 2和3中都有效,并且假设在常规情况下只有一个项可用,iteritems
方法在Python 2中将比标准对象{{1}提供微不足道的优势}。
修改强>
为了扩展这一效率点(Python 2中的items
vs items
),以下(快速和肮脏)时间显示前者优于后者的优势:
iteritems
此外,同时提取密钥和值可以节省一些额外费用。