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

Python基于多维字典中的值添加值的最佳方法

Python基于多维字典中的值添加值的最佳方法,python,dictionary,Python,Dictionary,我正试图根据字典第二层中的数据,找出在多维字典中插入数据的最佳和最快的方法 我的字典看起来像这样: data = {} data[12831] = {"sku" : "03921" , "online" = "" ...} 键12831是产品的ID SKU代表了它自己 此数据目录包含约40k个元素 我有一个包含所有在线SKU的数组,没有ID online = ["03921","04932",...] 到目前为止,我的做法是 循环数据字典并逐个检查字典sku是否在联机数组中 for key

我正试图根据字典第二层中的数据,找出在多维字典中插入数据的最佳和最快的方法

我的字典看起来像这样:

data = {}
data[12831] = {"sku" : "03921" , "online" = "" ...}
键12831是产品的ID SKU代表了它自己 此数据目录包含约40k个元素

我有一个包含所有在线SKU的数组,没有ID

online = ["03921","04932",...]
到目前为止,我的做法是 循环数据字典并逐个检查字典sku是否在联机数组中

for key in data:
  if data[key]["sku"] in online:
    data[key]["online"] = 1
此方法需要9秒来处理所有40k产品


有什么更好的方法吗?

我相信基于
的方法可能会加快您的过程。为了验证这一点,我对您的运行时和基于
pandas
的方法进行了快速分析

我尝试通过创建包含一些随机SKU和密钥的
数据和
联机
来复制您的设置

from random import randint, seed

seed(42)

data = {}
for i in range(40000):
    data[i]={"sku":randint(0,100000), "online":""}

online = [randint(0,100000) for _ in range(1000)]
我使用
timeit
为您的方法计时:

def approach1():
    for key in data:
        if data[key]["sku"] in online:
            data[key]["online"] = 1

print(timeit(approach1(), number=10))
>>>> 4.411111836
对于基于
pandas
的方法,我也做了同样的事情:

df = pd.DataFrame.from_dict(data, orient='index')

def approach2():
    in_online = df.index.isin(online)
    df.loc[in_online,'online']='1'

print(timeit(approach2, number=10))
>>>> 0.020047925999999938

如您所见,
pandas
方法的速度大约是另一种方法的220倍(尽管实际差异在一定程度上取决于数据的大小和结构)

我相信基于
pandas
的方法可能会加快您的过程。为了验证这一点,我对您的运行时和基于
pandas
的方法进行了快速分析

我尝试通过创建包含一些随机SKU和密钥的
数据和
联机
来复制您的设置

from random import randint, seed

seed(42)

data = {}
for i in range(40000):
    data[i]={"sku":randint(0,100000), "online":""}

online = [randint(0,100000) for _ in range(1000)]
我使用
timeit
为您的方法计时:

def approach1():
    for key in data:
        if data[key]["sku"] in online:
            data[key]["online"] = 1

print(timeit(approach1(), number=10))
>>>> 4.411111836
对于基于
pandas
的方法,我也做了同样的事情:

df = pd.DataFrame.from_dict(data, orient='index')

def approach2():
    in_online = df.index.isin(online)
    df.loc[in_online,'online']='1'

print(timeit(approach2, number=10))
>>>> 0.020047925999999938

如您所见,
pandas
方法的速度大约是另一种方法的220倍(尽管实际差异在一定程度上取决于数据的大小和结构)

这是我最后使用的代码

import pandas as pd


online = ["000123","000321",...]

data = {}
data[60011] = {"id":60011, "sku":"000123", "online" : "0"}
data[60012] = {"id":60012, "sku":"000122", "online" : "0"}
data[60013] = {"id":60013, "sku":"000321", "online" : "0"}
...

df = pd.DataFrame.from_dict(data, orient='index')

is_online = df["sku"].isin(online)
df.loc[is_online,'online']='1'

#return to Dictionary
final = df.to_dict('index')

这是我使用的最后一个代码

import pandas as pd


online = ["000123","000321",...]

data = {}
data[60011] = {"id":60011, "sku":"000123", "online" : "0"}
data[60012] = {"id":60012, "sku":"000122", "online" : "0"}
data[60013] = {"id":60013, "sku":"000321", "online" : "0"}
...

df = pd.DataFrame.from_dict(data, orient='index')

is_online = df["sku"].isin(online)
df.loc[is_online,'online']='1'

#return to Dictionary
final = df.to_dict('index')

我试着用熊猫,我觉得有些不对劲。ID和SKU不相关。如果SKU在ID索引中,我认为这是一个外观。索引基于ID,而不是方法2()第1行的SKU。我可能错了;)这是一个非常好的线索。我使用以下方法修复此问题:is_online=df[“sku”].isin(online)。0.44秒完成并插入数据库:)我很高兴我尝试了熊猫,我觉得有些不对劲。ID和SKU不相关。如果SKU在ID索引中,我认为这是一个外观。索引基于ID,而不是方法2()第1行的SKU。我可能错了;)这是一个非常好的线索。我使用以下方法修复此问题:is_online=df[“sku”].isin(online)。0.44秒完成并插入数据库:)我很高兴