从字典访问任意元素的Pythonic方法

2024-06-25 22:47:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一本字典,里面有很多东西。我想看看一个任意的项目:

print "Amongst our dictionary's items are such diverse elements as: %s" % arb(dictionary)

我不在乎哪一项。它不需要是随机

我可以想出很多方法来实现这一点,但它们似乎都是浪费。我想知道在Python中是否有首选的习惯用法,或者(甚至更好)是否缺少一个。

def arb(dictionary):
# Creates an entire list in memory. Could take a while.
    return list(dictionary.values())[0]

def arb(dictionary):
# Creates an entire interator. An improvement.
    for item in dictionary.itervalues():
        return item

def arb(dictionary):
# No iterator, but writes to the dictionary! Twice!
    key, value = dictionary.popitem()
    dictionary[key] = value
    return value

我所处的位置的性能还不够关键,所以我可能会被指责为过早优化,但我正在努力改进我的Python编码风格,因此如果有一个易于理解的变体,最好采用它。


Tags: 项目keyinandictionaryreturn字典value
3条回答

避免整个values/itervalues/viewvalues混乱,这在Python2或Python3中同样有效

dictionary[next(iter(dictionary))]

或者,如果您喜欢生成器表达式

next(dictionary[x] for x in dictionary)

我相信这个问题已经得到了很好的回答,但希望这一比较将有助于揭示干净代码与时间的权衡:

from timeit import timeit
from random import choice
A = {x:[y for y in range(100)] for x in range(1000)}
def test_pop():
    k, v= A.popitem()
    A[k] = v

def test_iter(): k = next(A.iterkeys())

def test_list(): k = choice(A.keys())

def test_insert(): A[0] = 0

if __name__ == '__main__':
    print('pop', timeit("test_pop()", setup="from __main__ import test_pop", number=10000))
    print('iter', timeit("test_iter()", setup="from __main__ import test_iter", number=10000))
    print('list', timeit("test_list()", setup="from __main__ import test_list", number=10000))
    print('insert', timeit("test_insert()", setup="from __main__ import test_insert", number=10000))

结果如下:

('pop', 0.0021750926971435547)
('iter', 0.002003908157348633)
('list', 0.047267913818359375)
('insert', 0.0010859966278076172)

似乎使用iterkeys的速度比弹出一个条目并重新插入要快得多,但比创建列表并从中选择随机对象快10倍。

类似于你的第二个解决方案,但在我看来稍微明显一点:

return next(iter(dictionary.values()))

这在Python2和Python3中都适用,但在Python2中,这样做效率更高:

return next(dictionary.itervalues())

相关问题 更多 >