2017-01-31 3 views
1

возможно получить первый аргумент, который содержит определенную строку в именованном кортеже такого есть:атрибута прибудет, содержащий определенную строку с именем кортеж питона

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

Я хотел бы получить первый аргумент, содержат строку 'a', что-то вроде:

getattr(data, contains('a')) 

любой пуфонический способ добиться этого? благодаря!

+0

Вы не можете просто положить их в списке и нарезать список: '[getattr (data, x) для x в data._fields, если x.startswith ('a')] [0]'? Или 'getattr (data, data._fields [0])'. – Abdou

+0

это сработает! спасибо! вы можете опубликовать ответ, если хотите! –

+0

См. Ответ. – Abdou

ответ

2

Вы можете сделать это путем доступа к полям в namedtuple и нарезка выход, чтобы получить нужный результат:

Либо:

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

Или:

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

Я надеюсь, это помогает.

1

Может быть, это не то, что вы хотите точно, но вы можете попробовать что-то вроде этого:

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

, и вы можете получить список в годах:

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

спасибо, очень чистый. –

Смежные вопросы