2013-08-26 95 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