Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 高效地找到满足关系的对象_Python_Large Data - Fatal编程技术网

Python 高效地找到满足关系的对象

Python 高效地找到满足关系的对象,python,large-data,Python,Large Data,假设我有一些对象,如本例(JSON代码): 我想写一个函数get_X_of u Y(X,Y),我可以用它来传递,例如,get_X_of u Y(“CEO”,公司[0]),并让它返回Bob 如何有效地为大型数据集执行此操作?我有以下功能: def get_X_of_Y (x, y): for person in people: if person.position == x and person.company == company.name: re

假设我有一些对象,如本例(JSON代码):

我想写一个函数
get_X_of u Y(X,Y)
,我可以用它来传递,例如,
get_X_of u Y(“CEO”,公司[0])
,并让它返回
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的索引。因此,有一个dict看起来像:

ceos = { "Company1": "Bob", "Company2": "Charlie" }
然后从中选择。每次人员列表发生变化时,您都必须更新该记录

但是对于真实的场景呢?。。。只需使用数据库


编辑:关于评论“如果我不知道我在找什么职位怎么办”-再次做数据库做的同样的事情-从两个元素/列创建索引:

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" }
    ]
}
然后,您可以创建一个人员列表,与嵌套的dict相比,该列表基本上是一个平面结构:

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

但是,如果你真的有数千人和数百家公司,我仍然建议使用数据库。

假设我有数千人和数百家公司。
是的,使用数据库?同意mu-使用数据库并在表
person
中的
company
字段上创建索引。但是如果我不知道我要找的是什么职位,比如我可能想检索公司1的经理,该怎么办?
>>> get_X_of_Y("CEO", companies[0])
[('Bob', 'CEO', 'Company1')]