有效地找到满足关系的对象
Efficiently find objects satisfying relationship
假设我有一些对象,就像这个例子(JSON 代码):
{
"people" : {
"Alice" : {
"position" : "Manager",
"company" : "Company1"
},
"Bob" : {
"position" : "CEO",
"company" : "Company1"
},
"Charlie" : {
"position" : "CEO",
"company" : "Company2"
}
},
"companies" : [
{ "name" : "Company1" },
{ "name" : "Company2" }
]
}
我想写一个函数get_X_of_Y(x, y)
,我可以用它来传递,例如,get_X_of_Y("CEO", companies[0])
并让它return Bob
.
我如何才能有效地对大型数据集执行此操作?我有以下功能:
def get_X_of_Y (x, y):
for person in people:
if person.position == x and person.company == company.name:
return person
else:
return None
假设我有几千人和几百家公司。有没有更快的方法通过遍历每个人来做到这一点?如果有办法让事情变得更快,我可以预先计算对象。
如mu
所说-使用数据库。
或者,您可以像数据库一样做 - 保留 CEO 的索引。所以有一个看起来像的字典:
ceos = { "Company1": "Bob", "Company2": "Charlie" }
和 select 从那里开始。每次人员列表更改时,您都必须更新该字典。
但是对于真实的场景呢?...就用数据库吧。
编辑:关于评论 "what if I don't know what position I'm looking for" - 再次做数据库所做的同样事情 - 从两个 elements/columns:
创建索引
positions_index = {
("Company1", "CEO"): "Bob",
("Company1", "Manager"): "Alice",
("Company2", "CEO"): "Charlie",
}
让我们说
data = {
"people" : {
"Alice" : {
"position" : "Manager",
"company" : "Company1"
},
"Bob" : {
"position" : "CEO",
"company" : "Company1"
},
"Charlie" : {
"position" : "CEO",
"company" : "Company2"
}
},
"companies" : [
{ "name" : "Company1" },
{ "name" : "Company2" }
]
}
然后你可以创建一个人员列表,与你的嵌套字典相比,它基本上是一个平面结构:
>>> people = [(key, value["position"], value["company"]) for key, value in data["people"].items()]
[('Charlie', 'Company2', 'CEO'),
('Bob', 'Company1', 'CEO'),
('Alice', 'Company1', 'Manager')]
还有一个公司列表,它再次取消了 dict 的结构:
>>> companies = [item['name'] for item in data["companies"]]
['Company1', 'Company2']
现在查询很简单,使用filter
方法
def get_X_of_Y (x, y):
return filter(lambda item: item[1]==x and item[2]==y, people)
因此您现在可以轻松搜索:
>>> get_X_of_Y("CEO", companies[0])
[('Bob', 'CEO', 'Company1')]
但是,如果你真的有数千人和数百家公司,我仍然建议使用数据库。
假设我有一些对象,就像这个例子(JSON 代码):
{
"people" : {
"Alice" : {
"position" : "Manager",
"company" : "Company1"
},
"Bob" : {
"position" : "CEO",
"company" : "Company1"
},
"Charlie" : {
"position" : "CEO",
"company" : "Company2"
}
},
"companies" : [
{ "name" : "Company1" },
{ "name" : "Company2" }
]
}
我想写一个函数get_X_of_Y(x, y)
,我可以用它来传递,例如,get_X_of_Y("CEO", companies[0])
并让它return Bob
.
我如何才能有效地对大型数据集执行此操作?我有以下功能:
def get_X_of_Y (x, y):
for person in people:
if person.position == x and person.company == company.name:
return person
else:
return None
假设我有几千人和几百家公司。有没有更快的方法通过遍历每个人来做到这一点?如果有办法让事情变得更快,我可以预先计算对象。
如mu
所说-使用数据库。
或者,您可以像数据库一样做 - 保留 CEO 的索引。所以有一个看起来像的字典:
ceos = { "Company1": "Bob", "Company2": "Charlie" }
和 select 从那里开始。每次人员列表更改时,您都必须更新该字典。
但是对于真实的场景呢?...就用数据库吧。
编辑:关于评论 "what if I don't know what position I'm looking for" - 再次做数据库所做的同样事情 - 从两个 elements/columns:
创建索引positions_index = {
("Company1", "CEO"): "Bob",
("Company1", "Manager"): "Alice",
("Company2", "CEO"): "Charlie",
}
让我们说
data = {
"people" : {
"Alice" : {
"position" : "Manager",
"company" : "Company1"
},
"Bob" : {
"position" : "CEO",
"company" : "Company1"
},
"Charlie" : {
"position" : "CEO",
"company" : "Company2"
}
},
"companies" : [
{ "name" : "Company1" },
{ "name" : "Company2" }
]
}
然后你可以创建一个人员列表,与你的嵌套字典相比,它基本上是一个平面结构:
>>> people = [(key, value["position"], value["company"]) for key, value in data["people"].items()]
[('Charlie', 'Company2', 'CEO'),
('Bob', 'Company1', 'CEO'),
('Alice', 'Company1', 'Manager')]
还有一个公司列表,它再次取消了 dict 的结构:
>>> companies = [item['name'] for item in data["companies"]]
['Company1', 'Company2']
现在查询很简单,使用filter
方法
def get_X_of_Y (x, y):
return filter(lambda item: item[1]==x and item[2]==y, people)
因此您现在可以轻松搜索:
>>> get_X_of_Y("CEO", companies[0])
[('Bob', 'CEO', 'Company1')]
但是,如果你真的有数千人和数百家公司,我仍然建议使用数据库。