[英]Getting specific data from list of dictionaries in Python using dot notation
[英]Python class return list of dictionaries as dot notation
假設您在 python 中有一個 class 返回:
d=[{'source_id': '1', 'source_desc': 'XML1'},
{'source_id': '2', 'source_desc': 'XML2'},
{'source_id': '3', 'source_desc': 'XML3'}]
假設 class 被稱為:
class ddata():
def __init__(var):
self.var=method_class(var)
def method_class(self,v):
´´´do stuff / dummy method´´´
return v
初始化:
mydata=ddata(d)
是否可以在 python 中向 class 添加特定方法以允許以下操作:偽代碼:
mydata.1.source_desc (would be XML1)
編輯目的是一個,並且只有一個鍵用作輸入點符號。 在這種情況下,數字。 數字是 int 或 str。 並且不一定是連續的,什么使返回列表中基於 position 的解決方案無效。
可以在 Python 中使用整數作為標識符,這與@BoarGules 所說的相反。 只是不在源代碼中。 證明:
>>> class Foo: pass
>>> foo = Foo()
>>> foo.__setattr__("1", "a number!")
>>> foo.1
File "<input>", line 1
foo.1
^
SyntaxError: invalid syntax
>>> foo.__getattribute__("1")
'a number!'
所以這是一個解決方案:
from typing import Dict, List
d = [
{'source_id': '1', 'source_desc': 'XML1'},
{'source_id': '2', 'source_desc': 'XML2'},
{'source_id': '3', 'source_desc': 'XML3'},
{'source_id': 'forty_two', 'source_desc': 'XML42'}
]
class DData:
def __init__(self, d: List[Dict[str, str]]):
for line in d:
source_id = line["source_id"]
source_desc = line["source_desc"]
self.__setattr__(source_id, source_desc)
def __getitem__(self, item):
return self.__getattribute__(item)
my_data = DData(d)
print(my_data["1"]) # XML1
print(my_data.forty_two) # XML42
# print(my_data.1) # SyntaxError: invalid syntax
我使用__getitem__
因為我發現它比__getattribute__
更友好。
但是只使用一個正確定義的 dict 會做同樣的事情,而且要簡單得多:
my_dict = {line["source_id"]: line["source_desc"] for line in d}
print(my_dict["1"]) # XML1
print(my_dict["forty_two"]) # XML42
我建議不要使用您無法在源代碼中編寫的標識符 ( 1
)。 而且我認為使用“字典表示法”( x["y"]
)與點表示法( xy
)沒有太大區別,但在您的情況下更易於維護。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.