我有一個Python字典的列表,我想檢查一個字典條目是否存在一個特定的術語。它的工作原理使用語法獲取字典值Python
if any(d['acronym'] == 'lol' for d in loaded_data):
print "found"
,但我也想獲得儲存在這個關鍵的價值,我的意思是d [「的縮寫」] [「意義」。我的問題是,當我嘗試打印出來時,Python不知道d。任何建議,也許我怎麼才能得到沒有循環遍歷所有列表的發生的索引?謝謝!
我有一個Python字典的列表,我想檢查一個字典條目是否存在一個特定的術語。它的工作原理使用語法獲取字典值Python
if any(d['acronym'] == 'lol' for d in loaded_data):
print "found"
,但我也想獲得儲存在這個關鍵的價值,我的意思是d [「的縮寫」] [「意義」。我的問題是,當我嘗試打印出來時,Python不知道d。任何建議,也許我怎麼才能得到沒有循環遍歷所有列表的發生的索引?謝謝!
你可以用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
函數。
如果你想使用的項目,而不是隻檢查它的存在:
for d in loaded_data:
if d['acronym'] == 'lol':
print("found")
# use d
break # skip the rest of loaded_data
謝謝,我只是希望有一種避免這種東西的方法! :-) – Crista23
'any'支票無論如何都會在幕後做到這一點,所以它效率不低! – jonrsharpe
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
如果你知道有最多一個匹配(或者,你只關心第一個),可以使用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'
+1這是一個非常好的方法,不會遍歷整個列表。 –
firstone = next((d for d in loaded_data if d['acronym'] == 'lol'), None)
爲您提供條件適用的第一個字典,如果沒有這樣的字典,則爲None
。
完美,這正是我一直在尋找的!非常感謝! :) – Crista23
@ Crista23我很高興,我更新的問題,沒有必要爲'any' :) –
但是,保持第一匹配字典被發現後,也可能會或沒有關係循環。 – RemcoGerlich