我有:
dictionary = {"foo":12, "bar":2, "jim":4, "bob": 17}
我想迭代这个字典,但是在值而不是键上,所以我可以在另一个函数中使用这些值。
例如,我想测试哪些字典值大于6
,然后将它们的密钥存储在列表中。我的代码如下所示:
list = []
for c in dictionary:
if c > 6:
list.append(dictionary[c])
print list
然后,在一个完美的世界中,list
将包含其值大于6
的所有键。
但是,我的for
循环只是遍历键;我想将其改为值!
非常感谢任何帮助。 谢谢
答案 0 :(得分:82)
>>> d = {"foo": 12, "bar": 2, "jim": 4, "bob": 17}
>>> [k for k, v in d.items() if v > 6] # Use d.iteritems() on python 2.x
['bob', 'foo']
我想更新这个答案,以便展示@glarrain的解决方案,我发现自己现在倾向于使用它。
[k for k in d if d[k] > 6]
这是完全交叉兼容的,不需要从.iteritems
(.iteritems
避免将列表保存到Python 2中的内存(已在Python 3中修复)到.items
的混淆更改。
@Prof.Falken提到了解决这个问题的方法
from six import iteritems
有效地修复了交叉兼容性问题但是要求您下载包six
然而,我不完全同意@glarrain这个解决方案更具可读性,即使Python应该只有一种方法,但这可能仅仅是个人偏好。在我看来,这取决于具体情况(例如,你可能有一个很长的字典名称,你不想输入两次,或者你想给这些值一个更可读的名字或其他原因)
一些有趣的时间:
在Python 2中,第二种解决方案更快,在Python 3中它们在原始速度上几乎完全相同。
$ python -m timeit -s 'd = {"foo": 12, "bar": 2, "jim": 4, "bob": 17};' '[k for k, v in d.items() if v > 6]'
1000000 loops, best of 3: 0.772 usec per loop
$ python -m timeit -s 'd = {"foo": 12, "bar": 2, "jim": 4, "bob": 17};' '[k for k, v in d.iteritems() if v > 6]'
1000000 loops, best of 3: 0.508 usec per loop
$ python -m timeit -s 'd = {"foo": 12, "bar": 2, "jim": 4, "bob": 17};' '[k for k in d if d[k] > 6]'
1000000 loops, best of 3: 0.45 usec per loop
$ python3 -m timeit -s 'd = {"foo": 12, "bar": 2, "jim": 4, "bob": 17};' '[k for k, v in d.items() if v > 6]'
1000000 loops, best of 3: 1.02 usec per loop
$ python3 -m timeit -s 'd = {"foo": 12, "bar": 2, "jim": 4, "bob": 17};' '[k for k in d if d[k] > 6]'
1000000 loops, best of 3: 1.02 usec per loop
然而,这些只是对小字典的测试,在巨大的字典中,我很确定没有字典键查找(d[k]
)会使.items
更快。
这似乎就是这种情况
$ python -m timeit -s 'd = {i: i for i in range(-10000000, 10000000)};' -n 1 '[k for k in d if d[k] > 6]'
1 loops, best of 3: 1.75 sec per loop
$ python -m timeit -s 'd = {i: i for i in range(-10000000, 10000000)};' -n 1 '[k for k, v in d.iteritems() if v > 6]'
1 loops, best of 3: 1.71 sec per loop
$ python3 -m timeit -s 'd = {i: i for i in range(-10000000, 10000000)};' -n 1 '[k for k in d if d[k] > 6]'
1 loops, best of 3: 3.08 sec per loop
$ python3 -m timeit -s 'd = {i: i for i in range(-10000000, 10000000)};' -n 1 '[k for k, v in d.items() if v > 6]'
1 loops, best of 3: 2.47 sec per loop
答案 1 :(得分:36)
要获取值,请使用dictionary.values()
要获取键值对,请使用dictionary.items()
答案 2 :(得分:10)
在词典上使用items
或iteritems
。类似的东西:
list = []
for k, v in dictionary.iteritems():
if v > 6:
list.append(k)
print list
答案 3 :(得分:4)
这个怎么样:
dictionary = {"foo":12, "bar":2, "jim":4, "bob": 17}
for val in dictionary.values():
# do something
答案 4 :(得分:4)
我认为最好的方法(考虑迁移到Python 3)是
>>> mydict = {'foo': 12, 'bar': 2, 'jim': 4, 'bob': 17}
>>> [k for k in mydict if mydict[k] > 6]
['bob', 'foo']
“最佳”的标准是可读性。
(免责声明:我的回答是基于Alex Martelli对其他问题https://stackoverflow.com/a/3744713/556413及@ jamylak对此问题的回答)
答案 5 :(得分:2)
这取决于您是否要修改字典(添加或删除项目)。如果没有,那么你可以试试:
for value in dictionary.itervalues(): #this returns a generator
print "do something with the value"
或者,如果您修改字典,则应迭代值的副本:
for value in dictionary.values(): #this returns a list of values
print "do something with the value"
如果您想同时使用键和值,可以使用dictionary.iteritems()
或dictionary.items()