[英]How to filter dictionary keys based on its corresponding values
我有:
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
循環只是遍歷鍵; 我想將其更改為值!
任何幫助是極大的贊賞。 謝謝
>>> 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
要獲取值,請使用dictionary.values()
要獲取鍵值對,請使用dictionary.items()
在字典上使用items
或iteritems
項。 就像是:
list = []
for k, v in dictionary.iteritems():
if v > 6:
list.append(k)
print list
這個怎么樣:
dictionary = {"foo":12, "bar":2, "jim":4, "bob": 17}
for val in dictionary.values():
# do something
我認為最好的方法(考慮遷移到 Python 3)是
>>> mydict = {'foo': 12, 'bar': 2, 'jim': 4, 'bob': 17}
>>> [k for k in mydict if mydict[k] > 6]
['bob', 'foo']
這取決於您是否要修改字典(添加或刪除項目)。 如果沒有,那么您可以嘗試:
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()
迭代對
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.