Фильтрация всех значений ключа словаря на основе одного ключа? - PullRequest
0 голосов
/ 27 февраля 2020

Скажем, если у нас есть словарь, как показано ниже:

{'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 ]

3 голосов
/ 27 февраля 2020

Вы можете попробовать это.

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 голос
/ 27 февраля 2020

Похоже, что вы ищете соответствующие элементы списка на основе списка, предоставленного для 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]})

Преимущество здесь в том, что вы выполняете итерацию только один раз для всех значений

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...