是否基于单个键过滤所有字典键值?

时间:2020-02-27 19:12:48

标签: python python-3.x list dictionary

说,如果我们有如下字典:

{'time' : [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
'x_coordinates': [3, 1, 2, 4, 6, 8, 2, 4, 8, 9],
'y_coordinates': [3, 5, 8, 1, 7, 3, 7, 2, 5, 2]
}

和一个类似的人

{'time' : [2, 6, 8, 10]}

我想用属于第二个字典的键值过滤掉属于第一个字典的所有键值。那是我想要的输出是:

{'time': [2, 6, 8, 10], 
'x_coordinates': [1, 8, 4, 9],
'y_coordinates': [5, 3, 2, 2]
}

如何以最有效的方式做到这一点?

2 个答案:

答案 0 :(得分:3)

您可以尝试一下。

a={'time' : [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
'x_coordinates': [3, 1, 2, 4, 6, 8, 2, 4, 8, 9],
'y_coordinates': [3, 5, 8, 1, 7, 3, 7, 2, 5, 2]
}
search={'time' : [2, 6, 8, 10]}
idx=[a['time'].index(i) for i in search['time']]
#[1, 5, 7, 9]
final_dict={key:[a[key][i] for i in idx] for key in a.keys()}

{'time': [2, 6, 8, 10],
 'x_coordinates': [1, 8, 4, 9],
 'y_coordinates': [5, 3, 2, 2]}

答案 1 :(得分:1)

您似乎正在根据time提供的列表来寻找相应的列表元素。这可以通过zip完成,并且要构建字典,您可以利用defaultdict

from collections import defaultdict


d = {'time' : [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
'x_coordinates': [3, 1, 2, 4, 6, 8, 2, 4, 8, 9],
'y_coordinates': [3, 5, 8, 1, 7, 3, 7, 2, 5, 2]
}

# sets provide faster lookup times than lists
vals = set([2, 6, 8, 10])

new_values = defaultdict(list)


for time, x, y in zip(d['time'], d['x_coordinates'], d['y_coordinates']):
    if time in vals:
        # you only have to do a single membership test, then you 
        # simply append the desired values
        new_values['time'].append(time)
        new_values['x_coordinates'].append(x)
        new_values['y_coordinates'].append(y)


defaultdict(<class 'list'>, {'time': [2, 6, 8, 10], 'x_coordinates': [1, 8, 4, 9], 'y_coordinates': [5, 3, 2, 2]})

这样做的好处是您只需对所有值进行一次迭代