简体   繁体   中英

Python: Print all namedtuples

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..

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

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?

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
>>>

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM