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

скажем, мне нужно сделать следующее: мне нужно сопоставить значения в списке 'check_keys' с ключами-значениями в словаре 'parm' и сохранить соответствующие ключи в том же порядке в новом списке 'insert'

parm = {'f': 'w', 'l': 'b', 'b': 'y', 'u': 'o', 't': 'r', 'r': 'g'}
check_keys = ['r','b','o','g','w','y']
insert = ['t','l','u','r','f','b']

Ответы [ 5 ]

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

Вы можете использовать понимание списка , чтобы решить это

insert = [k for i in check_keys for k in parm if parm[k] == i]
# ['t', 'l', 'u', 'r', 'f', 'b']
0 голосов
/ 07 октября 2018

Это не очень хорошее использование хеш-таблицы / словаря.Хэш-таблица дает вам быстрый доступ к значениям , учитывая ключи словаря.Здесь вы пытаетесь получить доступ к ключам словаря, учитывая значения (т.е. наоборот).

Это плохо, потому что:

  • Это медленно.Вам нужно будет перебрать весь словарь, чтобы найти ваши значения.
  • Результат недетерминированный, так как словари не упорядочены.Если вместо этого вы вводите parm = {'a': 'r', 'b': 'r'}, check_keys = [r], неизвестно, получите ли вы [a] или [b].

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

parm = {'f': 'w', 'l': 'b', 'b': 'y', 'u': 'o', 't': 'r', 'r': 'g'}
check_keys = ['r','b','o','g','w','y']
insert = ['t','l','u','r','f','b']

insert = []
for v in check_keys:
    for k in parm:
        if parm[k] == v:
            insert.append(k)

print insert

Если, конечно, это часть более крупной программы, я бы предложил вамНЕ используйте вышеупомянутый подход, но вместо этого переоцените весь ваш подход.

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

Это заняло некоторое время, но я думаю, что я понял, что вы хотите сделать.

Если я прав, вы не хотите переворачивать поиск словаря от значения к ключу.Самый простой способ - создать обратный словарь.

rparm = dict( (value,key) for key,value in parm.items())

Затем сопоставить данные, например,

insert = [rparm[key] for key in check_keys]

Извините за использование всего этого списка и генераторов.Если мы не знакомы с ними, я могу добавить классическую версию цикла.

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

Одним из возможных способов является обратный словарь, который можно сделать за линейное время (относительно размера вашего parm dict) в среднем.

Как только словарь перевернут, искомые значения становятся ключами, и теперь они легко доступны - O (1) на ключ в вашем списке check_keys.

rev_parm = dict((v, k) for k, v in parm.items())
insert = [rev_parm[k] for k in check_keys]
0 голосов
/ 07 октября 2018

Может быть, как-то так?

insert = []
for k, v in parm.items():
    if k in check_keys:
        insert.append(k)

Или это укороченная версия:

insert = [k for k, v in parm.items() if k in check_keys]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...