[英]How can I return key value dictionary pairs from a list of dictionaries of unknown amount?
我有作為單個字典返回的數據,例如:
{'key': 'RIDE', '3': 27.3531}
或作為未知數量的字典列表(即最多可以是 20 個字典列表或 2 個,如圖所示),例如:
[{'key': 'GH', '3': 154.24}, {'key': 'RIDE', '3': 27.34}]
我想編寫一段代碼來遍歷字典列表並返回每個字典中的所有鍵值對。
任何幫助將不勝感激,謝謝!
為了對此進行試驗,我們首先必須使用一個返回字典或字典列表的虛擬數據提供程序編寫一些代碼:
import random
def doSomething():
if random.random() <= 0.5:
return {'key': 'RIDE', '3': 27.3531}
else:
return [{'key': 'GH', '3': 154.24}, {'key': 'RIDE', '3': 27.34}]
#
現在我們遇到了您所描述的這種情況:您有時會收到一本字典,有時會收到一個字典列表。
現在:如何處理這種情況? 這不是太難:
x = doSomething()
if isinstance(x, dict):
x = [ x ]
for item in x:
print(item)
因此,正如我們所知,我們要么接收一個字典,要么接收一個字典列表,我們可以測試返回的值是哪種類型。 由於總是處理列表要方便得多,所以上面的示例首先將返回的字典轉換為列表,然后再進行任何其他數據處理。
所以這是通過“糾正錯誤”來完成的:錯誤在於您的數據提供者並不總是返回相同類型的數據。 因此,每當我們收到一本字典時,我們首先將字典打包到一個列表中。 只有在那之后,我們才開始我們首先想要的數據處理。 在這里,這個處理只是打印字典,但當然你可以像你提到的那樣遍歷鍵和值,或者做任何你認為合適的數據處理。
但是:擁有某種類型的 function 或返回不同類型數據的任何類型的子系統不是一個好主意。 如您所見,這強制在調用方實現額外的邏輯。 此外,如果我們想編寫規范,它會使事情復雜化(並且我們想為更復雜的程序編寫規范。)
例子:
import typing
import random
def doSomething() -> typing.Union[dict,typing.List[dict]]:
if random.random() <= 0.5:
return {'key': 'RIDE', '3': 27.3531}
else:
return [{'key': 'GH', '3': 154.24}, {'key': 'RIDE', '3': 27.34}]
#
這里的規范是使用typing
能力的正式規范。 因此,有關返回類型的信息以正式的方式指定。 盡管在正常情況下 Python 通常不會直接評估此信息,但此規范為任何程序員提供了有關返回類型的知識。
當然,我們也可以通過編寫某種文本文檔以非正式的方式編寫這樣的規范,但這沒有任何區別:通常,具有不同類型的返回值會使事情變得不必要地復雜化。 你可以這樣做——在某些情況下這是有道理的——但總的來說,最好盡可能避免這種情況,以簡化事情。
例如使用這種方法:
import random
def doSomething() -> typing.List[dict]:
# the old code we might choose not to change for some reason ...
if random.random() <= 0.5:
x = {'key': 'RIDE', '3': 27.3531}
else:
x = [{'key': 'GH', '3': 154.24}, {'key': 'RIDE', '3': 27.34}]
# but we can compensate ...
if isinstance(x, dict):
x = [ x ]
return x
#
現在我們使 function 始終返回相同類型的數據。 現在對我們來說更方便了:a)它簡化了調用者的處理過程,b)首先簡化了對返回數據的學習。
因此,將所有內容轉換為僅返回單一類型的數據后,我們的主程序將簡化為:
for item in x:
print(item)
或者,如果您想顯示鍵和值:
for item in x:
for k, v in item.items():
print(k, "->", v)
或者您對返回的數據進行任何類型的數據處理。
作為經驗法則,請記住,在任何類型的腳本或編程語言中:
始終以調用者易於使用且整個邏輯易於程序員理解的方式提供數據。 使提供數據成為子程序的問題,而不是調用者的問題。 盡可能簡化調用者的生活。
(是的,你可以決定違反這個原則而不遵循它,但如果你這樣做了,那么你真的必須有一個很好的理由。然后你真的需要知道你在做什么,因為你有一個非常非常特殊的情況。用我25年的專業軟件開發經驗告訴你:在99.999%的情況下,你不會有這種特殊情況。而且我感覺你的情況不屬於這種特殊情況。 ;-) )
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.