Я хочу создать именованный кортеж с 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
Как должен выглядеть код или есть еще лучший способ создать этот именованный кортеж?
вы можете использовать значения
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()))
Вы можете что-то вроде следующего
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()))