2014-01-11 115 views
0

我有一個Python字典的列表,我想檢查一個字典條目是否存在一個特定的術語。它的工作原理使用語法獲取字典值Python

if any(d['acronym'] == 'lol' for d in loaded_data): 
     print "found" 

,但我也想獲得儲存在這個關鍵的價值,我的意思是d [「的縮寫」] [「意義」。我的問題是,當我嘗試打印出來時,Python不知道d。任何建議,也許我怎麼才能得到沒有循環遍歷所有列表的發生的索引?謝謝!

回答

2

你可以用filter功能:

filter(lambda d: d['acronym'] == 'lol', loaded_data) 

這將返回包含字典的列表acronym == lol

l = filter(lambda d: d['acronym'] == 'lol', loaded_data) 
if l: 
    print "found" 
    print l[0] 

根本不需要使用any函數。

+0

完美,這正是我一直在尋找的!非常感謝! :) – Crista23

+0

@ Crista23我很高興,我更新的問題,沒有必要爲'any' :) –

+0

但是,保持第一匹配字典被發現後,也可能會或沒有關係循環。 – RemcoGerlich

0

如果你想使用的項目,而不是隻檢查它的存在:

for d in loaded_data: 
    if d['acronym'] == 'lol': 
     print("found") 
     # use d 
     break # skip the rest of loaded_data 
+0

謝謝,我只是希望有一種避免這種東西的方法! :-) – Crista23

+0

'any'支票無論如何都會在幕後做到這一點,所以它效率不低! – jonrsharpe

0

any()只給你回一個布爾值,所以你不能使用。所以只寫一個循環:

for d in loaded_data: 
    if d['acronym'] == 'lol': 
     print "found" 
     meaning = d['meaning'] 
     break 
else: 
    # The else: of a for runs only if the loop finished without break 
    print "not found" 
    meaning = None 

編輯:或改變成一個較籠統的功能:

def first(iterable, condition): 
    # Return first element of iterable for which condition is True 
    for element in iterable: 
     if condition(element): 
      return element 
    return None 

found_d = first(loaded_data, lambda d: d['acronym'] == 'lol') 
if found_d: 
    print "found" 
    # Use found_d 
3

如果你知道有最多一個匹配(或者,你只關心第一個),可以使用next

>>> loaded_data = [{"acronym": "AUP", "meaning": "Always Use Python"}, {"acronym": "GNDN", "meaning": "Goes Nowhere, Does Nothing"}] 
>>> next(d for d in loaded_data if d['acronym'] == 'AUP') 
{'acronym': 'AUP', 'meaning': 'Always Use Python'} 

然後根據您是否希望有一個異常或None作爲未找到值:

>>> next(d for d in loaded_data if d['acronym'] == 'AZZ') 
Traceback (most recent call last): 
    File "<ipython-input-18-27ec09ac3228>", line 1, in <module> 
    next(d for d in loaded_data if d['acronym'] == 'AZZ') 
StopIteration 

>>> next((d for d in loaded_data if d['acronym'] == 'AZZ'), None) 
>>> 

你甚至可以直接獲得的價值,而不是字典,如果你想:

>>> next((d['meaning'] for d in loaded_data if d['acronym'] == 'GNDN'), None) 
'Goes Nowhere, Does Nothing' 
+0

+1這是一個非常好的方法,不會遍歷整個列表。 –

0
firstone = next((d for d in loaded_data if d['acronym'] == 'lol'), None) 

爲您提供條件適用的第一個字典,如果沒有這樣的字典,則爲None