Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.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_Dictionary - Fatal编程技术网

在Python中创建嵌套字典最有效的方法是什么?

在Python中创建嵌套字典最有效的方法是什么?,python,dictionary,Python,Dictionary,我的字典中目前有超过10k个元素,如下所示: cars = [{'model': 'Ford', 'year': 2010}, {'model': 'BMW', 'year': 2019}, ...] 我还有第二本字典: car_owners = [{'model': 'BMW', 'name': 'Sam', 'age': 34}, {'model': 'BMW', 'name': 'Taylor', 'age': 34},

我的字典中目前有超过10k个元素,如下所示:

cars = [{'model': 'Ford', 'year': 2010},
        {'model': 'BMW', 'year': 2019},
        ...]
我还有第二本字典:

car_owners = [{'model': 'BMW', 'name': 'Sam', 'age': 34},
              {'model': 'BMW', 'name': 'Taylor', 'age': 34},
              .....]
但是,我想将这两个元素结合在一起,使其类似于:

combined = [{'model': 'BMW',
             'year': 2019,
             'owners: [{'name': 'Sam', 'age': 34}, ...]
            }]
将它们结合起来的最佳方式是什么?目前我正在使用For循环,但我觉得有更有效的方法来处理这个问题


**这只是一个虚假的数据示例,我的示例要复杂得多,但这有助于了解我想要实现的目标。

迭代第一个列表,创建一个dict,其中key val为model val,然后在第二个dict中,查找相同的key(model)并更新第一个dict,如果发现:

cars = [{'model': 'Ford', 'year': 2010}, {'model': 'BMW', 'year': 2019}]
car_owners = [{'model': 'BMW', 'name': 'Sam', 'age': 34}, {'model': 'Ford', 'name': 'Taylor', 'age': 34}]


dd = {x['model']:x for x in cars}

for item in car_owners:
    key = item['model']
    if key in dd:
        del item['model']
        dd[key].update({'car_owners': item})
    else:
        dd[key] = item

print(list(dd.values()))
输出:

[{'model': 'BMW', 'year': 2019, 'car_owners': {'name': 'Sam', 'age': 34}}, {'model': 'Ford', 'year': 2010, 'car_owners': {'name': 'Taylor', 
'age': 34}}] 

迭代第一个列表,创建一个dict,其中key val为model val,然后在第二个dict中,查找相同的key(model)并更新第一个dict,如果找到:

cars = [{'model': 'Ford', 'year': 2010}, {'model': 'BMW', 'year': 2019}]
car_owners = [{'model': 'BMW', 'name': 'Sam', 'age': 34}, {'model': 'Ford', 'name': 'Taylor', 'age': 34}]


dd = {x['model']:x for x in cars}

for item in car_owners:
    key = item['model']
    if key in dd:
        del item['model']
        dd[key].update({'car_owners': item})
    else:
        dd[key] = item

print(list(dd.values()))
输出:

[{'model': 'BMW', 'year': 2019, 'car_owners': {'name': 'Sam', 'age': 34}}, {'model': 'Ford', 'year': 2010, 'car_owners': {'name': 'Taylor', 
'age': 34}}] 

实际上,您希望性能方面的功能是使用以模型为键的字典。这样,您就可以进行O(1)查找,并可以快速获得所请求的元素(而不是每次循环以查找具有x型的汽车)。 如果你从列表开始,我会先创建字典,然后从那里开始一切都是O(1)

models_to_cars = {car['model']: car for car in cars}
models_to_owners = {}
for car_owner in car_owners:
    models_to_owners.setdefault(car_owner['model'], []).append(car_owner)


combined = [{
    **car,
    'owners': models_to_owners.get(model, [])
} for model, car in models_to_cars.items()]
那你就有了

combined = [{'model': 'BMW',
             'year': 2019,
             'owners': [{'name': 'Sam', 'age': 34}, ...]
            }]

正如您所希望的那样,实际上,您希望在性能方面使用以模型为关键的字典。这样,您就可以进行O(1)查找,并可以快速获得所请求的元素(而不是每次循环以查找具有x型的汽车)。 如果你从列表开始,我会先创建字典,然后从那里开始一切都是O(1)

models_to_cars = {car['model']: car for car in cars}
models_to_owners = {}
for car_owner in car_owners:
    models_to_owners.setdefault(car_owner['model'], []).append(car_owner)


combined = [{
    **car,
    'owners': models_to_owners.get(model, [])
} for model, car in models_to_cars.items()]
那你就有了

combined = [{'model': 'BMW',
             'year': 2019,
             'owners': [{'name': 'Sam', 'age': 34}, ...]
            }]

正如你所想

我认为问题是双重的。这些不是词典,而是(词典的)列表。如果至少有一个是真正的dict,则合并会更快,因为您不必“搜索”匹配的模型。福特去了哪里?对于如此大量的数据,您将需要开始考虑使用类似SQLite(或其他数据库)的东西。您不会有许多
dict
对象的内存开销,您可以使用SQL生成所需的组合。我认为问题是双重的。这些不是词典,而是(词典的)列表。如果至少有一个是真正的dict,则合并会更快,因为您不必“搜索”匹配的模型。福特去了哪里?对于如此大量的数据,您将需要开始考虑使用类似SQLite(或其他数据库)的东西。您不会有许多
dict
对象的内存开销,并且可以使用SQL生成所需的组合。