2013-08-26 77 views
1

我有以下代码:的Python:打印所有namedtuples

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 

有什么想法吗? 感谢..

+8

请勿使用编号变量。使用* list *来存储所有命名的元组。只需遍历列表即可打印所有包含的命名元组。 –

回答

7

的Martijn彼得斯在评论中建议:

不要使用编号的变量。使用列表来代替存储所有命名的 元组。只需遍历列表即可打印所有包含的命名为 的元组。

这里是什么样子:

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 
0

下面是一个例子:

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) 

...从 - What are "named tuples" in Python?

0

这应该告诉你如何:

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

你可以驱动一个子类,它保持跟踪它的实例:

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