如何在namedtuple对象上进行迭代?

时间:2018-10-18 17:47:54

标签: python python-2.7 loops namedtuple

这就是我所拥有的:

Site = namedtuple('Site', 'number x y')
Sites = namedtuple('Sites', 'p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14')

my_sites = Sites(Site('p1', 607, 184),
                 Site('p2', 698, 254),
                 Site('p3', 821, 309),
                 Site('p4', 569, 237),
                 Site('p5', 647, 302),
                 Site('p6', 727, 374),
                 Site('p7', 437, 289),
                 Site('p8', 548, 358),
                 Site('p9', 650, 416),
                 Site('p10', 352, 333),
                 Site('p11', 451, 432),
                 Site('p12', 222, 435),
                 Site('p13', 338, 507),
                 Site('p14', 431, 579))

这就是我想要做的:

cc = 1;

for x in build:

    x = my_sites.p[cc].x
    y = my_sites.p[cc].y

    cc = cc + 1

build只是一个随机列表。

这是我得到的错误:

AttributeError: 'Sites' object has no attribute 'p'

有什么办法解决这个问题?

1 个答案:

答案 0 :(得分:0)

  

问题:如何迭代namedtuple对象?

如所指出的:使用getattr(..)。 –威廉·范昂塞姆
如所指出的:Sites ...没有p ...,他们有p1, p2, p3, etc – martineau

您必须像这样使用它:

from collections import namedtuple

Site = namedtuple('Site', 'number x y')
Sites = namedtuple('Sites', 'p1 p2 p3')

my_sites = Sites(Site(1, 607, 184), Site(2, 698, 254), Site(3, 821, 309))

for x in [1,2,3]:
    attr = "p{}".format(x)
    site = getattr(my_sites, attr)
    print("{}:{}".format(attr, site))

for attr in ['p1', 'p2', 'p3']:
    print("{}:{}".format(attr, getattr(my_sites, attr)))

print("p2:{}".format(my_sites.p2))
  

输出

p1:Site(number=1, x=607, y=184)
p2:Site(number=2, x=698, y=254)
p3:Site(number=3, x=821, y=309)
Site(number=2, x=698, y=254)

使用Python测试:3.4.2