Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.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_Optimization - Fatal编程技术网

优化python中两个词典列表的合并

优化python中两个词典列表的合并,python,dictionary,optimization,Python,Dictionary,Optimization,我有两个列表,每个列表包含10-15k本字典。 第一个列表名为活动,其中包含具有以下结构的词典: {u'campaign_id': u'400037', u'ctr': u'1.1210', u'roi': 0, u'end_date': None, u'revenue': 0.0, u'website_id': 1, u'enabled': u'active', u'budget': u'100.00', u'default_bid': u'0.05', u'cost': 30.63, u's

我有两个列表,每个列表包含10-15k本字典。 第一个列表名为
活动
,其中包含具有以下结构的词典:

{u'campaign_id': u'400037', u'ctr': u'1.1210', u'roi': 0, u'end_date': None, u'revenue': 0.0, u'website_id': 1, u'enabled': u'active', u'budget': u'100.00', u'default_bid': u'0.05', u'cost': 30.63, u'start_date': u'2018-02-13'}
第二个列表-
dayed\u data
dict的结构是:

{u'cost': 0.0, u'campaign_id': u'400037', u'revenue': 0.0}
目标是匹配活动id,并将两个键添加到
活动数据中的相关dict中,其中
昨天的日期[“收入”]
昨天的日期[“成本”]
将是
活动数据中的新键

我通过以下代码实现了这一逻辑:

campaigns = model.get_campaigns_data(self.mysql_db)
yesterday_data = model.get_yesterday_data(self.mysql_db, yesterday)
try:
    for campaign in campaigns:
        missing = filter(lambda c: c["campaign_id"] == str(campaign["campaign_id"]), yesterday_data)
        if not missing:
            pass
        else:
            campaign["yesterday_spend"] = missing[0]["cost"]
            campaign["yesterday_revenue"] = missing[0]["revenue"]
但是由于每个列表中都有这么多的词典,所以速度非常慢,而且我想相信,这远远不是实现这一目标的最佳方式。 知道如何改进代码以获得相同的结果吗?

试试:

>>> d1 = {u'campaign_id': u'400037', u'ctr': u'1.1210', u'roi': 0, u'end_date': None, u'revenue': 0.0, u'website_id': 1, u'enabled': u'active', u'budget': u'100.00', u'default_bid': u'0.05', u'cost': 30.63, u'start_date': u'2018-02-13'}
>>> d2 = {u'cost': 0.0, u'campaign_id': u'400037', u'revenue': 0.0}

>>> if d1["campaign_id"] == d2["campaign_id"]:
      d1.update(d2)
输出

{u'roi': 0, u'ctr': u'1.1210', u'end_date': None, u'revenue': 0.0, u'website_id': 1, u'enabled': u'active', u'campaign_id': u'400037', u'budget': u'100.00', u'default_bid': u'0.05', u'cost': 0.0, u'start_date': u'2018-02-13'}

用熊猫来做这个。将这两个字典转换为dataframe,然后合并它们

注意:我只做了一行。如果有100行,请将我正在构建的
df_1
df_2
行中的
index=[0]
替换为
index=range(100)

campaigns = {u'campaign_id': u'400037', u'ctr': u'1.1210', u'roi': 0, u'end_date': None, u'revenue': 0.0, u'website_id': 1, u'enabled': u'active', u'budget': u'100.00', u'default_bid': u'0.05', u'cost': 30.63, u'start_date': u'2018-02-13'}

yesterday_data = {u'cost': 0.0, u'campaign_id': u'400037', u'revenue': 0.0}

import pandas as pd
df1 = pd.DataFrame(campaigns, index=[0])
df2 = pd.DataFrame(yesterday_data, index=[0])

df_new = df1.merge(df2, on=['campaign_id'])
要取回字典表单,请执行以下操作:

df_new.to_dict(orient='records')
注2:
例如,
数据
中的键,例如,
成本
收入
将以
\u y
作为后缀结束,而
活动
中的键将以
\u x
作为后缀。这适用于两个数据帧之间共用的键。

id
分组并减少:

grouper = {}
for d in campaigns_data:
    grouper[d["campaign_id"]] = d

# assuming the keys match up:

for d in yesterday_data:
    grouper[["campaign_id"]].update(yesterday_spend=d['cost'],
                                    yesterday_revenue=d['revenue'])

把字典翻过来。使其
campaign\u id
成为键,并映射到每个数据集对应字典的引用,然后您可以循环其中一个并在O(n)中执行。