Как перебрать объект namedtuple? - PullRequest
0 голосов
/ 18 октября 2018

Вот что у меня есть:

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 голосов
/ 18 октября 2018

Вопрос : Как выполнить итерацию для объекта именованного кортежа?

Как указано: используйте 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

...