сравнить значения списка со словарем python - PullRequest
0 голосов
/ 17 февраля 2020

Я думаю, что это очень просто c, но я изо всех сил пытаюсь найти способ решить эту проблему. В словаре python, как показано ниже (где значения являются списками), как мне удобно сравнивать значения каждой пары ключ-значение? Например, как я могу получить пары ключ-значение, где:

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

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

Другими словами, мне нужно получить

"a": ["bc", "5", "0"]
"b": ["nc", "8", "5"]
test_dict = {"a": ["bc", "5", "0"], "b": ["nc", "8", "5"], "c": ["bc", "3", "0"]}

Любая подсказка приветствуется.

Ответы [ 3 ]

1 голос
/ 17 февраля 2020

Я бы использовал понимание, распаковывая все элементы, чтобы содержать вещи в чистоте. Попробуйте

In [1]: out = {k:(v1, v2, v3) for k, (v1, v2, v3) in test_dict.items() if k not in v1 and int(v2) > int(v3)}

In [2]: out
Out[2]: {'a': ('bc', '5', '0'), 'b': ('nc', '8', '5')}
1 голос
/ 17 февраля 2020

Сделано в однострочник. Он также ищет третий элемент для сравнения (не только второй).

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

dict({v[0]:(k,v) for v,k in sorted((v,k) for k,v in test_dict.items())}.values())
1 голос
/ 17 февраля 2020

Я бы использовал вспомогательное отображение, индексированное по первому элементу значения:

aux = {}
for k, v in test_dict.items():
    if v[0] in aux:
        if v[1] > aux[v[0]][1][1]:
            aux[v[0]] = (k, v)
    else: aux[v[0]] = (k, v)
resul = {k: v for k,v in aux.values()}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...