2015-05-30 18 views
5

BenGenişleyen küpe

def convert_tuple(self, listobj, fields=['start', 'end', 'user']): 
    return [(getattr(obj, field) for field in fields) 
      for obj in listobj] 

istediğim My istenen çıkış yukarıdaki fonksiyonun çıktısı

[genexp, genexp, genexp] 

onun hakkıdır

[('2am', '5am', 'john'), ('3am', '5am', 'john1'), ('3am', '5am', 'john2') ] 

olmalıdır bu işlevi kullanıyorum jeneratör ifadesi ve istediğim gibi genişletemedim

cevap

7

Typecast bir tuple

def convert_tuple(self, listobj, fields=['start', 'end', 'user']): 
    return [tuple(getattr(obj, field) for field in fields) 
      for obj in listobj] 
+0

Hemen hemen +1'i unut;) –

+0

Err. Yaşlanıyorsun! :( –

+1

Hala senin kıçını tekmeleyebilirim;) –

5

Pars için gen-exp Bhargav's answer göre bir jeneratör ifade çağrı tuple oluştururken veya harita ile operator.attrgetter kullanabilirsiniz:

from operator import attrgetter 
def convert_tuple(listobj, fields=['start', 'end', 'user']): 
    return list(map(attrgetter(*fields), listobj)) # python2 just map 

Demo:

class Foo(): 
    def __init__(self): 
     self.x = 1 
     self.y = 2 
     self.z = 3 


f = Foo() 
f2 = Foo() 
f2.x = 10 


print(convert_tuple([f,f2])) 

[(1, 2, 3), (10, 2, 3)] 

Python2 için liste çağrısını kaldırabilirsiniz.

+0

Typo 'dosyalananlar = [...]' alanları değiştir = [... ' – Scott

+0

@Scott, yep cheers. –

+0

Sadece merak etmek, sadece cevabınızı düzenlemek (bu durumda açık bir yazım hatası olduğunda) veya yorum bırakmak için daha kabul edilir mi? – Scott

İlgili konular