>>> 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應該只有一種方法來進行辯論,也可能只是個人偏好。在我看來,這取決於情況(例如,你可能有一個長字典名稱,你不想輸入兩次,或者你想給這些值更易讀的名字或其他原因)
10一些有趣的計時:
在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
這個問題的標題應該因爲你真正想實現(什麼改變和答案反映了這一)獲取某個子句爲真的字典中相應值的鍵。像「如何根據其對應值過濾字典鍵」可能是更好的選擇。 – glarrain