2010-07-17 29 views
5

Ich bin ein Python-Neuling. Ich habe dieses kleine Problem. Ich möchte eine Liste von Objekten drucken, aber alles, was es druckt, ist eine seltsame interne Repräsentation des Objekts. Ich habe sogar __str__ Methode definiert, aber immer noch bekomme ich diese seltsame Ausgabe. Was fehlt mir hier?Drucken einer Liste von Objekten

class person(object): 
    def __init__(self, name, age): 
    self.name = name 
    self.age = age 

    def __str__(self): 
    return self.name + "(" + str(self.age) + ")" 

def partition(coll, pred): 
    left = [] 
    right = [] 
    for c in coll: 
    if pred(c): 
     left.append(c) 
    else: 
     right.append(c) 
    return left, right 


people = [ 
    person("Cheryl", 20), 
    person("Shemoor", 14), 
    person("Kimbala", 25), 
    person("Sakharam", 8) 
] 

young_fellas, old_fellas = partition(people, lambda p : p.age < 18) 
print(young_fellas) 
print(old_fellas) 

Bitte beachten Sie, dass ich weiß, dass ich entweder eine for Schleife oder eine map Funktion hier nutzen kann. Ich suche etwas kürzer und idiomatischer. Vielen Dank.

EDIT:

Noch eine Frage: Ist der obige Code von mir Pythonic?

Antwort

0

try zwingende repr

def __repr__(self): 
     return self.name + "(" + str(self.age) + ")" 

Edit: Bessere Weise, Dank Paul.

def __repr__(self): 
    return "%s(%d)" % (self.name, self.age) 
+1

String interpolation '"% s (% d) "% (self.name, self.age)' oder ''' .join (list_of_string_bits)' sind bessere Stile zu lernen als kleine Strings mit ' + '. – PaulMcG

+0

und @Paul: Danke für den Vorschlag :-) –

+1

@Paul McGuire: in diesem speziellen Fall nicht wirklich, also troll es nicht :) –

1

Sie könnten tun:

print(map(str,young_fellas)) 
+1

Sie sollten die Frage vollständig lesen Sie wissen. –

+0

Über den pythonischen Teil gibt es einen Abschnitt darüber in der Dokumentation. Sie könnten die repro (lib) verwenden, um eine eigene Debug-Repräsentation zu erstellen. In diesem Fall ist Person ("name", 1) eine bessere Repräsentation als Person (name, 1), weil sie wie ein gültiger Python-Ausdruck aussehen sollte, der zum Erstellen eines Objekts verwendet werden könnte. http://docs.python.org/reference/datamodel.html#object.__repr__ http://www.python.org/dev/peps/pep-0008/ – SiggyF

+0

Vielen Dank für den Vorschlag :-) –

2

Sie machte dieses Objekt:

person("Cheryl", 20) 

Das bedeutet repr nach der Erstellung gleich sein soll:

def __repr__(self): 
return 'person(%r,%r)' % (self.name,self.age) 

Ausgang wird:

[person('Shemoor',14), person('Sakharam',8)] 
[person('Cheryl',20), person('Kimbala',25)] 
+0

Danke für den Vorschlag :-) –

+1

Gern geschehen. Nette Funktion, die Sie geschrieben haben, diese Partition. Ich bin selbst ein String-Partitions-Fan und ich grabe es. –

+0

++: Kommt mit dem Bonus, dass die Ausgabe direkt in Python zurückgegeben werden kann (was die Idee von repr() sowieso ist) –

Verwandte Themen