python语法中的namedtuple来自内置类型和orderedDict

python语法中的namedtuple来自内置类型和orderedDict,python,dictionary,namedtuple,Python,Dictionary,Namedtuple,这是我关于stackoverflow的第一个问题。我刚学了两个名字,发现了一些奇怪的东西 当您想从iterable启动namedtuple时,您必须添加前缀*或使用_make方法 例如: 但是,当您从同一个集合包启动tuple、dict甚至orderedict时,您可以只启动tuple()或dict()或orderedict() 例如: 为什么namedtuple的语法如此奇怪?谢谢 根据您的示例,它的行为类似于dict: from collections import namedtuple M

这是我关于stackoverflow的第一个问题。我刚学了两个名字,发现了一些奇怪的东西

当您想从iterable启动namedtuple时,您必须添加前缀*或使用_make方法

例如:

但是,当您从同一个集合包启动tuple、dict甚至orderedict时,您可以只启动tuple()或dict()或orderedict()

例如:


为什么namedtuple的语法如此奇怪?谢谢

根据您的示例,它的行为类似于dict:

from collections import namedtuple
MyTuple = namedtuple('MyTuple', 'A B C')

items = (('A', 1), ('B', 2), ('C', 3))

my_tuple = MyTuple(**dict(items))

您可以看到一些关于namedtuple为何以这种方式设计的讨论。基本原因是创建namedtuple的“正常”方法是使用类似于
MyTupleClass(1,2,3)
的调用,其中的值被接受为单独的参数。如果它只接受一个iterable参数(如
tuple
所做的那样),那么您必须使用一组额外的括号编写
MyTupleClass((1,2,3))
(即
MyTupleClass(1,2,3)
将引发错误,如
tuple(1,2,3)
所做的那样)。确实,这意味着如果从iterable初始化,则必须使用额外的星型(或使用
。\u make()
方法),但这并不难,只是不同而已。这个决定显然是为了简化简单的大小写(用文字值初始化),而牺牲了使更复杂的大小写(从iterable解包)与常规元组稍有不同的代价。

您的预期结果是什么?可能重复感谢您的回复!我期望类似的东西,比如城市(德里大学数据)。所以我不需要添加前缀*你是在问
*
是做什么的,还是为什么nametuple需要它?没错!为什么它被设计成一个*@Brenbarn谢谢你的例子!对不起,我现在更糊涂了。为什么在这里?我是python新手…
**
说要将dict的键值对映射到MyTuple构造函数中。您应该阅读上面@DYZ留下的内容谢谢!但我认为这会有点偏差。对不起,我没说清楚。我的问题是何时使用tuple(我的示例中的数据和项)启动实例。为什么namedtuple必须添加*但orderedDict没有?(城市(*德里大学数据)V.S.订购信息和通信技术(项目))。谢谢对我可以这样总结您的观点:tuple接受一个参数,namedtuple接受多个参数,因此*只需解压缩项以匹配nametuple中的每个参数。顺便说一句,OrderedDict对象也只接受一个参数?谢谢我刚试过。OrderDict最多只能获取1个类似于tuple的参数。谢谢你的帮助!
from collections import OrderedDict

items = (
('A', 1),
('B', 2),
('C', 3)
)

regular_dict = dict(items)

ordered_dict = OrderedDict(items)
from collections import namedtuple
MyTuple = namedtuple('MyTuple', 'A B C')

items = (('A', 1), ('B', 2), ('C', 3))

my_tuple = MyTuple(**dict(items))