Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在namedtuple对象上迭代?_Python_Python 2.7_Loops_Namedtuple - Fatal编程技术网

Python 如何在namedtuple对象上迭代?

Python 如何在namedtuple对象上迭代?,python,python-2.7,loops,namedtuple,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 = 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:“站点”对象没有属性“p”
有什么办法解决这个问题吗

问题:如何在命名的耦合对象上迭代

正如所指出的:使用getattr(…)–威廉·范昂森
正如所指出的:
站点
。。。没有
p
…,他们有
p1、p2、p3等

你必须这样使用它:

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

使用
getattr(..)
。为什么要迭代一个namedtuple对象,迭代元组绝对没有意义您考虑过使用列表吗?@Antti HaapalaL迭代
namedtuple
实例与迭代任何其他序列(如
tuple
list
)一样有意义,并且可能在某些上下文中发生(例如,如果函数只要求传递给它的参数是可编辑的,则如何在函数内访问内容,例如
sum()
).也就是说,这个问题中显示的情况似乎不是这样。@roganjosh:据我所知,OP似乎并没有试图改变
名称的倍数,所以我认为你的猜测是不正确的。不管怎样,看看安蒂对此有何回应将是一件有趣的事情。