说,如果我们有如下字典:
{'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]
}
如何以最有效的方式做到这一点?
答案 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]})
这样做的好处是您只需对所有值进行一次迭代