以列表为条件删除字典中的项



我有一本这样的字典:

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)

最新更新