我有一本这样的字典:
features_id = {
id1: [a, b, c, d],
id2: [c, d],
id3: [a, e, f, d, g, k],
...
}
我也有一个值列表,我想创建一个新的字典。像这样:
list_of_values = [a, c]
实现目标:
我想要一本这样的新字典:
new_dict = {
id1: [a, c],
id2: [c],
id3: [a],
...
}
对于如此大的数据集(1M),使用pandas和numpy可能是有意义的。我不确定在这种情况下的速度,但你可以尝试以下操作:
import pandas as pd
import numpy as np
features_id = {
'id1': ['a', 'b', 'c', 'd'],
'id2': ['c', 'd'],
'id3': ['a', 'e', 'f', 'd', 'g', 'k'],
'id4': ['e', 'f', 'd', 'g', 'k']}
list_of_values = ['a', 'c']
y = np.array(list_of_values)
def filt(x):
x = np.array(x)
return x[np.isin(x,y)].tolist()
pd.Series(features_id).map(filt).to_dict()
>>> out
'''
{'id1': ['a', 'c'], 'id2': ['c'], 'id3': ['a'], 'id4': []}
我写下这个答案是为了将来有类似问题的用户。
如上所述,这个答案的解决方案是:
set_of_values = set(list_of_values)
new_dict = {k:[x for x in v if x in set_of_values] for k, v in features_id.items()}
使用集合而不是列表大大加快了计算速度,特别是在我必须比较1M+字典键的情况下,需要几秒钟而不是几分钟。
对于初始字典的每个项,如果元素包含在项中,则必须搜索特征列表的每个项。如果有,则添加。
在新字典中第一次添加键时,必须创建该值,在其他键时,必须将其附加到现有的键上。
new_dict = {}
for key, value in features_id.items():
for val in list_of_values:
if val in value:
if key not in new_dict:
new_dict[key] = [val]
else:
new_dict[key].append(val)