[英]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.