Python 许多属性的内联循环的命名元组

Python 许多属性的内联循环的命名元组,python,python-3.x,Python,Python 3.x,我想创建一个包含30个条目的命名元组,并缩短代码,我想这样做: from collections import namedtuple header_dict = {0: "id", 1: "PR_DISPLAY_NAME", 2: "PR_HOME_ADDRESS_STREET", 3: "PR_ZIP", ... 29: "PR_SURNAME"

我想创建一个包含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))))
从Python3.6开始,PythonDict保留插入顺序。因此,在Python3.6中,您可以

Person = namedtuple('Person', ' '.join(header_dict.values()))

通常,namedtuples用于知道字段名称并希望以简洁的方式键入字段的情况。您使用它们的方式感觉就像是混合了数据和变量。为什么你需要一个命名的元组而不是字典呢?但是3.6中的顺序是不可依赖的。。但是从Python3.7可以依赖它,从3.6可以工作