Фильтровать словарь по значениям массива - PullRequest
0 голосов
/ 26 октября 2018

У меня есть словарь, который имеет следующие значения:

dictionary = {(10,9): 1, (44,11): 2, (1,1): 99}

В основном мои ключи - это пары целых чисел, а значения каждого ключа - просто целые числа.

У меня есть массив, в котором хранится набор ключей:

array = [(1,1), (5,19), (58,7)]

Я бы хотел отфильтровать в своем словаре только те элементы, ключи которых хранятся в массиве. В моем случае после фильтрации словаря я получу следующее:

dictionary = {(1,1): 99}

, поскольку единственный ключ словаря, который хранится в массиве, является (1,1)

Какой самый эффективный способ сделать это?

Ответы [ 4 ]

0 голосов
/ 26 октября 2018

Как насчет просто:

res = {i: dictionary[i] for i in array if i in dictionary}

Это происходит в O (n) , где n - это количество элементов в array и нене требует каких-либо дополнительных структур данных.

Для ваших dictionary и array это дает нам:

{(1, 1): 99}
0 голосов
/ 26 октября 2018

Вот что означает:

>>> dictionary = {(10,9): 1, (44,11): 2, (1,1): 99}
>>> lst = [(1,1), (5,19), (58,7)]    
>>> d = {k:v for k,v in dictionary.items() if k in lst}
>>> {(1, 1): 99}

Я переименовал array в lst, потому что это list.Мы не должны путать списки с numpy массивами, array.array или типом bytearray.

Вы также можете написать традиционный цикл for, если вы еще не знакомы с пониманием:

>>> d = {}
>>> for key in dictionary:
...:    if key in lst:
...:        d[key] = dictionary[key]
...:        
>>> d
>>> {(1, 1): 99}
0 голосов
/ 26 октября 2018

Вы можете найти установленное пересечение ключей словаря и кортежей массивов, а затем получить новые значения в понимании dict.Это уменьшит сложность поиска каждого ключа в вашем массиве:

dictionary = {(10,9): 1, (44,11): 2, (1,1): 99}
array = [(1,1), (5,19), (58,7)]

>>> {i:dictionary[i] for i in set(dictionary.keys()).intersection(array)}
{(1, 1): 99}
0 голосов
/ 26 октября 2018

Вы можете сделать что-то вроде этого:

dictionary = {(10,9): 1, (44,11): 2, (1,1): 99}
array = [(1,1), (5,19), (58,7)]

result = { k:v for k, v in dictionary.items() if k in array}

выход

{(1, 1): 99}

Или даже быстрее, превращая список в набор :

s = set(array)
result = {k: v for k, v in dictionary.items() if k in s}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...