我目前正在创建一个字典,其中包含一个名为元组的字典和一个浮点作为格式{(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
答案 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)}
很好,我想。