2010-07-17 64 views
5

我是Python新手。我有这个小问题。我想打印一个对象列表,但它打印的内容都是对象的一些奇怪的内部表示。我甚至定义了__str__方法,但我仍然得到这个奇怪的输出。我在这里错过了什么?打印对象列表

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) 

请注意,我知道我可以使用一个for环或这里map功能。我正在寻找更短,更习惯的东西。谢谢。

编辑:

一个问题:是我的Python化的上面的代码?

回答

0

尝试重写再版

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

编辑:更好的办法,感谢保罗。

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

字符串插值'“%s(%d)”%(self.name,self.age)'或'''.join(list_of_string_bits)'是比使用' +”。 – PaulMcG 2010-07-17 16:15:06

+0

和@Paul:谢谢你的建议:-) – 2010-07-17 17:51:15

+1

@Paul McGuire:在这个特殊的情况下并不是真的,所以不要怪它:) – 2010-07-17 23:18:47

1

你可以这样做:

print(map(str,young_fellas)) 
+1

你应该完全知道你所知道的问题。 – 2010-07-17 15:35:45

+0

关于pythonic部分,文档中有一节。您可以使用repr(lib)创建您自己的调试表示。 在这种情况下,person(“name”,1)比person(name,1)更好的表示,因为它应该看起来像一个可用于重新创建对象的有效Python表达式。 http://docs.python.org/reference/datamodel.html#object.__repr__ http://www.python.org/dev/peps/pep-0008/ – SiggyF 2010-07-17 15:49:56

+0

谢谢您的建议:-) – 2010-07-17 17:50:49

2

你做这个对象:

person("Cheryl", 20) 

这意味着创建之后再版应该是相同的:

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

输出变为:

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

感谢您的建议:-) – 2010-07-17 17:50:21

+1

不客气。你写的很好的功能,这个分区。我自己是一个字符串分区风扇,我会将其挖掘。 – 2010-07-17 22:26:01

+0

++:带有可以直接将输出反馈回python的奖金(无论如何repr()的想法) – 2010-07-17 23:20:22