Reputation: 31
I have the following code:
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)
My question is how can I print all namedtuples, for example:
print (Test.number_A)
I want to see somthing like this as a result:
1
3
5
any ideas? thanks..
Upvotes: 3
Views: 3834
Reputation: 123473
You could drive a subclass that kept track of its instances:
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
Output:
1
3
5
Upvotes: 1
Reputation:
This should show you how:
>>> 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
>>>
Really though, your best bet is to use a list instead of numbered variables:
>>> 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
>>>
Upvotes: 0
Reputation: 561
Here is an example:
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 - What are "named tuples" in Python?
Upvotes: 0
Reputation: 45542
Martijn Peters advises in the comments:
Do not use numbered variables. Use a list to store all the named tuples instead. Simply loop over the list to print all contained named tuples.
Here is what that looks like:
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
Gives:
1
3
5
Upvotes: 8