List vs Dict用于具有ID的对象列表

时间:2015-09-12 00:24:55

标签: python list dictionary

首先,速度不是一个大问题,因为列表的长度相对较小。我对风格和代码经济更感兴趣。

我有一个图表(节点和边),我需要为每个节点存储数据。我使用这样的类:

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]...))

我并没有真正使用列表nodenodes的位置来表示任何内容;该节点始终由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}}

我在这里遗漏了什么吗?这类数据的最佳做法是什么?

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)