首先,速度不是一个大问题,因为列表的长度相对较小。我对风格和代码经济更感兴趣。
我有一个图表(节点和边),我需要为每个节点存储数据。我使用这样的类:
class Node:
def __init__(self,node_id,name,edges,[more data]):
self.node_id = node_id
self.name = name
etc.
etc.
然后(当前)从文件中读取我的节点并将其放入列表中,如下所示:
with open("filepath.txt") as f:
content = f.readlines()
nodes = []
for line in content:
lst = ast.literal_eval(line)
nodes.append(Node([lst[0],lst[1],lst[2]...))
我并没有真正使用列表node
中nodes
的位置来表示任何内容;该节点始终由node_id
标识,该someData
先前是唯一确定的。
这意味着如果我想从node_id
为7的节点获取属性for n in nodes:
if n.node_id == 7:
print(n.someData)
,请说,我必须使用:
node_id
这看起来非常低效。
所以,我决定使用字典,从Node
类中删除sumTotal = sum(n.someData for n in nodes)
并将其用作密钥。字典看起来像'正确'的结构,当然?但是,在许多地方,这使我的代码变得更糟!
例如,我之前的位置:
sumTotal = sum(nodes[k].someData for k in nodes)
我现在必须使用:
sumTotal = sum(n.someData for n in nodes.values())
或
{{1}}
我在这里遗漏了什么吗?这类数据的最佳做法是什么?
答案 0 :(得分:1)
如果node_id
是唯一键,则可以执行以下操作:
nodes = {}
for line in content:
lst = ast.literal_eval(line)
nodes[lst[0]] = Node(lst[0],lst[1],lst[2]...))
如果你以后需要对它们做任何事情,它会更快更清洁:
print nodes[7].someData
你必须做这样的事情来获得总和:
sumTotal = sum(nodes[k].someData for k in nodes)