快速搜索大型python词典中的大型列表项

时间:2014-05-30 18:11:56

标签: python dictionary pandas

我目前正在创建一个字典,其中包含一个名为元组的字典和一个浮点作为格式{(nameA,nameB)的值:datavalue,(nameB,nameC):datavalue,...}

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

如何避免慢线性for循环?我创建了一个字典,其名称为key,如果应该包含值,则为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

1 个答案:

答案 0 :(得分: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)}

很好,我想。