Как опустить ключ и значение при создании списка словарей, используя понимание - PullRequest
0 голосов
/ 10 апреля 2020

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

old_dict_list = [
    { 'old_key_1': 'value1a', 'old_key_2': 'value2a', 'old_key_3': 'value3a'},
    { 'old_key_1': 'value1b', 'old_key_2': 'value2b', 'old_key_3': 'value3b'},
]

new_dict_list = [
    {
        'new_key1': old_dict['old_key_1'],
        'new_key2': old_dict['old_key_2'], # exclude this key entirely if some condition is met
        'new_key3': old_dict['old_key_3'],
    }
    for old_dict in old_dict_list
]

print(new_dict_list)

Я не знаю ни одного способа условно исключить ключ полностью при использовании подобного понимания. Единственная идея, которая у меня возникла, - это использовать фиксированное значение ключа, например, «Нет», при выполнении условия, затем выполнить отдельный проход по списку словарей и удалить эти ключи «Нет».

Есть ли способ сделать это? это всего лишь один проход понимания?

Ответы [ 2 ]

1 голос
/ 10 апреля 2020

Я бы не стал зацикливаться на том факте, что вы делаете свой новый список в понимании.

Очевидно, что если вы можете преобразовать словарь из старого формата в новый формат, это просто

new = [transform(o) for o in old]

Тогда ваш вопрос: «Могу ли я написать функцию для преобразования», то есть «да», если есть какой-либо способ описать то, что вы пытаетесь сделать (ваш пример далеко не завершен):

def transform(old):
    return {new(k): v for k, v in old.items() if condition(k, v)}

def new(key):
    return {'old_key_1': 'new_key1', ...}[key]

def condition(key, value):
    if key == 'old_key_2' and value == 'value2b':
         return False
    return True
0 голосов
/ 10 апреля 2020

Вот трюк, и, как правило, большим пальцем, , если возможно, следует избегать уловок .

new_dict_list = [
    {
        'new_key1': old_dict['old_key_1'],
        'new_key3': old_dict['old_key_3'],
        **({} if old_dict['old_key_2'].endswith("b") else {'new_key2': old_dict['old_key_2']})
    }
    for old_dict in old_dict_list
]

print(new_dict_list)
# [{'new_key1': 'value1a', 'new_key3': 'value3a', 'new_key2': 'value2a'}, {'new_key1': 'value1b', 'new_key3': 'value3b'}]

Я использовал оператор ** для распаковки дикта. Это условие: {}, если условие выполнено, или {'new_key2': old_dict['old_key_2']}, если условие не выполнено. Следовательно, ключ new_key2 создается только в том случае, если условие не выполняется.

В этом примере условие old_dict['old_key_2'].endswith("b"), но вы можете установить любое другое условие для old_dict.

...