именованный кортеж для встроенного цикла для многих атрибутов

1

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

from collections import namedtuple
header_dict = {0: "id",
               1: "PR_DISPLAY_NAME",
               2: "PR_HOME_ADDRESS_STREET",
               3: "PR_ZIP",
               ...
               29: "PR_SURNAME",
               }

Person = namedtuple('Person', '{} {} {}'.format(header_dict[0], header_dict[1], header_dict[2]))

s = '{} ' * 30
Person = namedtuple('Person', s.format(header_dict[(i for i in range(30)]))

Первая инструкция "Person =..." работает, но вторая приводит к:

KeyError: <generator object <genexpr> at 0x7fc2a1cff240>

Я использую Python 3.4.2

Как должен выглядеть код или есть еще лучший способ создать этот именованный кортеж?

  • 1
    Обычно namedtuples предназначены для случаев, когда вы знаете имена своих полей и хотите аккуратно их напечатать. То, как вы их используете, похоже на смешивание данных и переменных. Зачем вам нужен именованный кортеж, а не, например, словарь?
Теги:
python-3.x

2 ответа

1
Лучший ответ

вы можете использовать значения

In [1]: header_dict = {0: "id",
   ...:                1: "PR_DISPLAY_NAME",
   ...:                2: "PR_HOME_ADDRESS_STREET",
   ...:                3: "PR_ZIP",
   ...:                29: "PR_SURNAME",
   ...:                }
   ...:                

In [2]: s = '{} ' * len(header_dict)

In [3]: s.format(*header_dict.values())
Out[3]: 'id PR_DISPLAY_NAME PR_HOME_ADDRESS_STREET PR_ZIP PR_SURNAME '

и ваш код будет:

Person = namedtuple('Person',s.format(*header_dict.values()))
1

Вы можете что-то вроде следующего

Person = namedtuple('Person', s.format(*(header_dict[i] for i in range(30))))

Из python 3.6, python dict сохраняет порядок вставки. Итак, из python 3.6 вы можете сделать

Person = namedtuple('Person', ' '.join(header_dict.values()))
  • 0
    Но на порядок в 3.6 не следует полагаться
  • 0
    Правда .. Но из питона 3.7 на него можно положиться и из 3.6 он работает

Ещё вопросы

Сообщество Overcoder
Наверх
Меню