簡體   English   中英

"如何根據對應的值過濾字典鍵"

[英]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()

在字典上使用itemsiteritems項。 就像是:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM