2015-05-30 8 views
5

Ich bin mit dieser FunktionExpanding Tupeln in Liste Verständnis Generator

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

Meine gewünschte Ausgabe, die ich sollte

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

Der Ausgang der obigen Funktion ist

[genexp, genexp, genexp] 

Sein sein wollen Generator Ausdruck und ich konnte es nicht erweitern, wie ich es wollte

Antwort

7

Typecast die gen-exp zu einem tuple

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

Fast vergessen, Sie zu +1;) –

+0

Err. Du wirst alt! :( –

+1

Ich könnte immer noch deinen Arsch jung fella;) –

5

Die Pars schaffen einen Generator Ausdruck Anruf Tupel als pro Bhargav's answer oder Sie können operator.attrgetter mit Karte verwenden:

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

Sie können den Listenaufruf für python2 entfernen.

+0

Tippfehler 'fileds = [...]' Wechsel zu 'fields = [...' – Scott

+0

@Scott, yep prost. –

+0

Nur wundernd, ist es mehr akzeptiert, nur Ihre Antwort zu bearbeiten (wenn es einen klaren Tippfehler wie in diesem Fall gibt) oder einen Kommentar hinterlassen? – Scott