【问题标题】:Searching items of large list in large python dictionary quickly快速搜索大型python字典中的大型列表项
【发布时间】:2014-05-30 18:11:55
【问题描述】:

我目前正在制作一个字典,其中名称元组作为键,浮点数作为 {(nameA, nameB) : datavalue, (nameB, nameC) : datavalue ,...} 形式的值p>

值数据来自我制作的 pandas DataFrame 的矩阵,其名称作为索引和列标签。我使用函数createDictionaryKeys() 为名为@9​​87654321@ 的最终字典创建了一个有序的键列表。我遇到的问题是,并非此列表中的所有名称都出现在我的数据矩阵中。我只想在我的最终字典的数据矩阵中包含确实出现的名称。

如何进行这种搜索以避免缓慢的线性 for 循环?我创建了一个字典,其名称为键,如果应该包含它,则值为 1,否则为 0。它的形式为{nameA : 1, nameB: 0, ... },称为allow_dict。我希望用它来做某种哈希搜索。

def createDictionary( keynamefile, seperator, datamatrix, matrixsep):
    import pandas as pd

    keys = createDictionaryKeys(keynamefile, seperator)
    final_dict = {}

    data_df = pd.read_csv(open(datamatrix), sep = matrixsep)    
    pd.set_option("display.max_rows", len(data_df))

    df_indices = list(data_df.index.values)
    df_cols = list(data_df.columns.values)[1:]
    for i in df_indices:
        data_df = data_df.rename(index = {i:df_cols[i]})
    data_df = data_df.drop("Unnamed: 0", 1) 

    allow_dict = descriminatePromoters( HARDCODEDFILENAME, SEP, THRESHOLD )

    #print ( item for item in df_cols if allow_dict[item] == 0 ).next()

    present = [ x for x in keys if x[0] in df_cols and x[1] in df_cols]
    for i in present:
        final_dict[i] = final_df.loc[i[0],i[1]]

    return final_dict

【问题讨论】:

    标签: python dictionary pandas


    【解决方案1】:

    在 python 集合中测试存在性是 O(1),所以很简单:

    present = [ x for x in keys if x[0] in set(df_cols) and x[1] in set(df_cols)]
    

    ...应该可以加快速度。由于您无论如何都在 O(n) 中进行迭代(并且必须构建您的 final_dict),因此类似于:

    colset = set(df_cols)
    final_dict = {k: final_df.loc[k[0],k[1]]
                  for k in keys if (k[0] in colset)
                  and (k[1] in colset)}
    

    会很好,我想。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-24
      • 1970-01-01
      • 2019-06-18
      • 1970-01-01
      • 1970-01-01
      • 2014-01-12
      • 2010-11-28
      • 1970-01-01
      相关资源
      最近更新 更多