Python: распечатать все именованные кортежи

У меня есть следующий код:

from collections import namedtuple

Test = namedtuple('Test', ['number_A', 'number_B'])

test_1 = Test(number_A=1, number_B=2)
test_2 = Test(number_A=3, number_B=4)
test_3 = Test(number_A=5, number_B=6)

Мой вопрос в том, как я могу распечатать все namedtuples, например:

print (Test.number_A)

Я хочу увидеть что-то вроде этого в результате:

1
3
5

Любые идеи? Благодарность..


person user2719106    schedule 26.08.2013    source источник
comment
Не используйте числовые переменные. Вместо этого используйте список для хранения всех именованных кортежей. Просто переберите список, чтобы напечатать все содержащиеся в нем именованные кортежи.   -  person Martijn Pieters    schedule 26.08.2013


Ответы (4)


Мартейн Петерс советует в комментариях:

Не используйте числовые переменные. Вместо этого используйте список для хранения всех именованных кортежей. Просто переберите список, чтобы напечатать все содержащиеся в нем именованные кортежи.

Вот как это выглядит:

Test = namedtuple('Test', ['number_A', 'number_B'])
tests = []
tests.append(Test(number_A=1, number_B=2))
tests.append(Test(number_A=3, number_B=4))
tests.append(Test(number_A=5, number_B=6))

for test in tests:
    print test.number_A

Дает:

1
3
5
person Steven Rumbalski    schedule 26.08.2013

Вы можете управлять подклассом, который отслеживает его экземпляры:

from collections import namedtuple

_Test = namedtuple('_Test', ['number_A', 'number_B'])

class Test(_Test):
    _instances = []
    def __init__(self, *args, **kwargs):
        self._instances.append(self)
    def __del__(self):
        self._instances.remove(self)
    @classmethod
    def all_instances(cls, attribute):
        for inst in cls._instances:
            yield getattr(inst, attribute)

test_1 = Test(number_A=1, number_B=2)
test_2 = Test(number_A=3, number_B=4)
test_3 = Test(number_A=5, number_B=6)

for value in Test.all_instances('number_A'):
    print value

Выход:

1
3
5
person martineau    schedule 26.08.2013

Вот пример:

import collections

#Create a namedtuple class with names "a" "b" "c"
Row = collections.namedtuple("Row", ["a", "b", "c"], verbose=False, rename=False)   

row = Row(a=1,b=2,c=3) #Make a namedtuple from the Row class we created

print (row)    #Prints: Row(a=1, b=2, c=3)
print (row.a)  #Prints: 1
print (row[0]) #Prints: 1

row = Row._make([2, 3, 4]) #Make a namedtuple from a list of values

print (row)   #Prints: Row(a=2, b=3, c=4)

... from - Что такое именованные кортежи в Python?

person Mat Whiteside    schedule 26.08.2013

Это должно показать вам, как:

>>> from collections import namedtuple
>>> Test = namedtuple('Test', ['number_A', 'number_B'])
>>> test_1 = Test(number_A=1, number_B=2)
>>> test_2 = Test(number_A=3, number_B=4)
>>> test_3 = Test(number_A=5, number_B=6)
>>> lis = [x.number_A for x in (test_1, test_2, test_3)]
>>> lis
[1, 3, 5]
>>> print "\n".join(map(str, lis))
1
3
5
>>>

Однако на самом деле лучше всего использовать список вместо пронумерованных переменных:

>>> from collections import namedtuple
>>> Test = namedtuple('Test', ['number_A', 'number_B'])
>>> lis = []
>>> lis.append(Test(number_A=1, number_B=2))
>>> lis.append(Test(number_A=3, number_B=4))
>>> lis.append(Test(number_A=5, number_B=6))
>>> l = [x.number_A for x in lis]
>>> l
[1, 3, 5]
>>> print "\n".join(map(str, l))
1
3
5
>>>
person Community    schedule 26.08.2013