2010-07-17 16 views
5

Sono un principiante di Python. Ho questo piccolo problema. Voglio stampare una lista di oggetti ma tutto ciò che stampa è una strana rappresentazione interna dell'oggetto. Ho persino definito il metodo __str__, ma sto ottenendo questo output strano. Cosa mi manca qui?Stampa di un elenco di oggetti

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) 

prega di notare che so di poter utilizzare un loop for o una funzione map qui. Sto cercando qualcosa di più breve e più idiomatico. Grazie.

EDIT:

Ancora una domanda: è il codice precedente del mio Pythonic?

risposta

0

prova sovrascrivendo repr

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

Edit: Meglio così, grazie a Paul.

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

Interpolazione stringa '"% s (% d) "% (self.name, self.age)' o ''' .join (list_of_string_bits)' sono stili migliori da imparare rispetto all'aggiunta di piccoli bit di stringhe usando ' +'. – PaulMcG

+0

e @Paul: Grazie per il suggerimento :-) –

+1

@Paul McGuire: in questo caso particolare non proprio, quindi non trollarlo :) –

1

Si potrebbe fare:

print(map(str,young_fellas)) 
+1

Si dovrebbe leggere la domanda completamente lo sai. –

+0

Per quanto riguarda la parte pythonic, c'è una sezione su questo nei documenti. È possibile utilizzare repr (lib) per creare la propria rappresentazione di debug. In questo caso la persona ("nome", 1) è una rappresentazione migliore della persona (nome, 1) perché dovrebbe apparire come un'espressione Python valida che potrebbe essere usata per ricreare un oggetto. http://docs.python.org/reference/datamodel.html#object.__repr__ http://www.python.org/dev/peps/pep-0008/ – SiggyF

+0

Grazie per il suggerimento :-) –

2

vostro reso questo oggetto:

person("Cheryl", 20) 

Ciò significa repr dovrebbe essere lo stesso dopo la creazione:

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

uscita diventa:

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

Grazie per il suggerimento :-) –

+1

Siete i benvenuti. Bella funzione che hai scritto, questa partizione. Io sono un fan delle partizioni di stringhe e me lo sto scavando. –

+0

++: Viene fornito con il bonus che l'output può essere reimmesso direttamente in python (qual è l'idea di repr() in ogni caso) –

Problemi correlati