2017-01-31 2 views
1

ist es möglich, mit dem ersten Argument zu erhalten, die eine bestimmte Zeichenfolge in einem benannten Tupel enthält, hat:get Attribut eine bestimmte Zeichenfolge eines benannten Tupel Python

import collections 

data_line = collections.namedtuple('ex', 'a_1 b_1 a_2') 
data = data_line(a_1=10, b_1=11, a_2=10) 

getattr(data, 'a_2') 

ich das erste Argument bekommen möchte, dass enthalten die Zeichenfolge 'a', so etwas wie:

getattr(data, contains('a')) 

jeden pythonic Weg, dies zu acheive? Vielen Dank!

+0

Sie können nicht nur setzen sie in einer Liste und schneiden Sie die Liste: '[getattr (Daten, x) für x in data._fields wenn x.startswith ('a')] [0]'? Oder 'getattr (data, data._fields [0])'. – Abdou

+0

das würde funktionieren! danken! Du kannst als Antwort antworten wenn du willst! –

+0

Bitte siehe Antwort. – Abdou

Antwort

2

Sie können es durch den Zugriff auf die Felder der namedtuple und Schneiden des Ausgangs Ihre gewünschte Ergebnis zu erhalten getan:

Entweder:

[getattr(data, x) for x in data._fields if x.startswith('a')][0] 

Oder:

getattr(data, [x for x in data._fields if x.startswith('a')][0]) 

Ich hoffe, das hilft.

1

Vielleicht ist das nicht das, was Sie genau wollen, aber Sie können so etwas wie dies versuchen:

def contains(val): 
    if val.startswith('a'): 
     return True 
    else: 
     return False 
for a in filter(contains, data._fields): 
    getattr(data, a) 

und Sie können eine Liste eines der haben wollen:

a_list = list(filter(contains, data._fields)) 
+0

danke, sehr sauber. –

Verwandte Themen