Перебор всех значений и поиск ключа для значения - PullRequest
0 голосов
/ 05 мая 2020

Мне нужно перебрать словарь и найти ключи определенных значений. Словарь выглядит следующим образом:

z1 = {9376: 172, 1: 168, 2: 179, 3: 2, 132: 9740, 145: 179, 137: 185, 135: 1, 142: 13528, 113: 158, 9781: 176, 9782: 168, 152: 13527, 9375: 9504, 127: 1}

также у меня есть список, который я хочу проверить по словарю и найти соответствующие ключи.

z =[13527,9741,9740,9505,9504,200,189,185,176,172,168,1]

Мне нужно чтобы найти, какие значения из z присутствуют в z1, а затем составить словарь совпадающего значения и ключа. Ниже приведен код, который я использую

for i in range(len(z1)) :
    try :
        p = z[i]
        a = list(z1.keys())[list(z1.values()).index(p)]
        e1.append(a)
        e2.append(p)
    except (ValueError, IndexError,AttributeError) :
        continue
e3 = list(zip(e1,e2))
print(e3)

Результат, который я получаю:

[(152, 13527), (132, 9740), (9375, 9504), (137, 185), (9781, 176), (9376, 172), (1, 168), (135, 1)]

Теперь в словаре z1 вы можете видеть, что значение 168,1 повторяется дважды и имеет уникальные ключи. Когда я запускаю для l oop, я получаю только одну пару "ключ-значение". Что мне делать, чтобы все ключи имели одинаковые значения. т.е. мой окончательный ответ должен быть таким:

[(152, 13527), (132, 9740), (9375, 9504), (137, 185), (9781, 176), (9376, 172), (1, 168), (9782,168) (135, 1), (127,1)]

Ответы [ 2 ]

0 голосов
/ 05 мая 2020

Обход значений словаря в первую очередь сводит на нет цель использования словаря.

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

Если значения не уникальны, создайте словарь, например value, [list_of_keys]. Такой подход был бы намного быстрее.

Каждый раз обход значений будет O(n), но построение обратного словаря будет O(1). При больших значениях n ваша программа будет работать значительно быстрее.

0 голосов
/ 05 мая 2020

Может это то, что вам нужно:

e3 = [(k, i) for i in z for k in z1 if i==z1[k]]

Дает мне:

[(152, 13527), (132, 9740), (9375, 9504), (137, 185), (9781, 176), (9376, 172), (1, 168), (9782, 168), (135, 1), (127, 1)]
...