循环在python中命名元组的元素

use*_*827 21 python namedtuple

我有一个命名元组,我赋值如下:

class test(object):
            self.CFTs = collections.namedtuple('CFTs', 'c4annual c4perren c3perren ntfixing')

            self.CFTs.c4annual = numpy.zeros(shape=(self.yshape, self.xshape))
            self.CFTs.c4perren = numpy.zeros(shape=(self.yshape, self.xshape))
            self.CFTs.c3perren = numpy.zeros(shape=(self.yshape, self.xshape))
            self.CFTs.ntfixing = numpy.zeros(shape=(self.yshape, self.xshape))
Run Code Online (Sandbox Code Playgroud)

有没有办法循环命名元组的元素?我试过这样做,但不起作用:

for fld in self.CFTs._fields:
                self.CFTs.fld= numpy.zeros(shape=(self.yshape, self.xshape))
Run Code Online (Sandbox Code Playgroud)

Paw*_*ski 28

namedtuple是一个元组,所以你可以像普通元组一样迭代:

>>> from collections import namedtuple
>>> A = namedtuple('A', ['a', 'b'])
>>> for i in A(1,2):
    print i


1
2
Run Code Online (Sandbox Code Playgroud)

但元组是不可变的,所以你不能改变它的价值

如果您需要可以使用的字段名称:

>>> a = A(1, 2)
>>> for name, value in a._asdict().iteritems():
    print name
    print value


a
1
b
2

>>> for fld in a._fields:
    print fld
    print getattr(a, fld)


a
1
b
2
Run Code Online (Sandbox Code Playgroud)

  • 这似乎在Python 3.6中起作用:`a._asdict().items()` (7认同)
  • .iteritems() -> .items() 对于 python3 (4认同)
  • 只需用 self.CTFs 替换 a (2认同)

iam*_*mbo 8

Python 3.6+

您可以像普通元组一样简单地循环这些项目:

MyNamedtuple = namedtuple("MyNamedtuple", "a b")
a_namedtuple = MyNamedtuple(a=1, b=2)

for i in a_namedtuple:
    print(i)
Run Code Online (Sandbox Code Playgroud)

从Python 3.6开始,如果您需要属性名称,您现在需要执行以下操作:

for name, value in a_namedtuple._asdict().items():
    print(name, value)
Run Code Online (Sandbox Code Playgroud)

笔记

如果你尝试使用a_namedtuple._asdict().iteritems()它会抛出 AttributeError: 'collections.OrderedDict' object has no attribute 'iteritems'


小智 6

from collections import namedtuple
point = namedtuple('Point', ['x', 'y'])(1,2)
for k, v in zip(point._fields, point):
    print(k, v)
Run Code Online (Sandbox Code Playgroud)

输出:

x 1
y 2
Run Code Online (Sandbox Code Playgroud)