Проверьте ключи словаря на наличие элементов списка, создайте список значений, если он есть, в противном случае - «Нет» - PullRequest
1 голос
/ 02 октября 2019

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

Предположим, несколько словарей различной длины:

dict_1 = {'A':4, 'C':5}
dict_2 = {'A':1, 'B':2, 'C':3}
dict_3 = {'B':6}

Общим знаменателем для этих словарей является то, что все они имеют общие ключи в этом списке:

my_keys= ['A','B','C']

, но в некоторых отсутствует один или несколько ключей.

Цель состоит в том, чтобы создатьсписок списков, где каждый элемент списка представляет собой список всех существующих значений в каждом словаре, или «Нет», где нет определенного ключа. Сами ключи, будучи идентичными во всех словарях, можно игнорировать.

Таким образом, в этом случае ожидаемый результат:

    final_list = 
    [[4,"None",5],
    [1,2,3],
    ["None",6,"None"]]

Я не уверен, как именно к нему подойти. Вы можете начать с каждого элемента в my_keys и проверить его наличие по каждому ключу в каждом словаре;если у соответствующего dict есть ключ, значение этого ключа добавляется во временный список;в противном случае добавляется «None». После того, как все my_keys будут повторены, временный список добавляется к окончательному списку, и цикл начинается снова.

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

1 Ответ

2 голосов
/ 02 октября 2019

dict.get может вернуть значение по умолчанию (например, None). Если мы возьмем ваши примеры:

dict_1 = {'A':4, 'C':5}
dict_2 = {'A':1, 'B':2, 'C':3}
dict_3 = {'B':6}
my_keys= ['A','B','C']

Тогда dict_1.get('B', None) - это способ убедиться, что мы получаем значение по умолчанию None. Мы можем выполнить цикл по всем ключам одинаково:

def dict_to_list(d, keys):
    return [d.get(key, None) for key in keys]

Пример:

>>> dict_to_list(dict_1, my_keys)
[4, None, 5]
>>> dict_to_list(dict_2, my_keys)
[1, 2, 3]
>>> dict_to_list(dict_3, my_keys)
[None, 6, None]

РЕДАКТИРОВАТЬ: None является аргументом по умолчанию, даже если он не указан явно, поэтому dict_1.get('B')будет работать так же хорошо, как dict_1.get('B', None)

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