#python #dictionary
#python #словарь
Вопрос:
Я пытаюсь использовать функцию для создания словаря с некоторыми переменными полями в соответствии с аргументами, которые я даю функции. Идея состоит в том, чтобы попробовать несколько конфигураций и получить разные словари.
У меня уже есть функция, но она выглядит непитонической и выглядит очень жестко запрограммированной.
def build_entry(prefix=None,
field_a=None,
field_b=None,
quantity_a=None,
quantity_b=None,
):
fields = {}
if prefix is not None:
fields['prefix'] = prefix
if field_a is not None:
fields['field_a'] = field_a
if field_b is not None:
fields['field_b'] = field_b
if quantity_a is not None:
fields['quantity_a'] = quantity_a
if quantity_b is not None:
fields['quantity_b'] = quantity_b
return fields
Идея состоит в том, чтобы вызвать функцию следующим образом:
fields = build_entry(*config)
Input: [26, 0, None, None, 20]
Output: {'prefix': 26, 'field_a': 0, 'quantity_b': 5}
Input: [20, 5, None, None, None]
Output: {'prefix': 20, 'field_a':5}
Input: [None, None, 0, 5, None]
Output: {'field_b': 0, 'quantity_a':5}
Есть идеи, как сделать эту функцию лучше или более pythonic? Или есть какая-либо функция, которая уже делает это?
Я использую Python 2.7.
Ответ №1:
def build_entry(*values):
keys = ['prefix', 'field_a', 'field_b', 'quantity_a', 'quantity_b']
return { k: v for k, v in zip(keys, values) if v is not None}
А затем вызывается таким же образом:
In [1]: build_entry(*[26, 0, None, None, 20])
Out[1]: {'prefix': 26, 'field_a': 0, 'quantity_b': 20}
Ответ №2:
Я думаю, что вы хотите что-то вроде этого:
def build_entry(**kwargs):
return kwargs
if __name__ == '__main__':
print(build_entry(prefix=1, field_a='a'))
Выводит:
{'prefix': 1, 'field_a': 'a'}