代码之家  ›  专栏  ›  技术社区  ›  one-zero-zero-one

打印对象列表

  •  5
  • one-zero-zero-one  · 技术社区  · 15 年前

    我是一个蟒蛇新手。我有个小问题。我想打印一个对象列表,但它所打印的只是对象的一些奇怪的内部表示。我甚至定义了 __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 循环或A map 功能在这里。我在找一些更简短、更惯用的东西。谢谢。

    编辑:

    还有一个问题:上面的密码是我的蟒蛇吗?

    4 回复  |  直到 15 年前
        1
  •  7
  •   Community CDub    8 年前

    除非你明确地将 str 这是 __repr__ method 用于渲染对象。

    Difference between __str__ and __repr__ in Python 了解更多详细信息。

        2
  •  2
  •   Tony Veijalainen    15 年前

    您制作的此对象:

    person("Cheryl", 20)
    

    这意味着创建后repr应该相同:

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

    输出变为:

    [person('Shemoor',14), person('Sakharam',8)]
    [person('Cheryl',20), person('Kimbala',25)]
    
        3
  •  1
  •   SiggyF    15 年前

    你可以这样做:

    print(map(str,young_fellas))
    
        4
  •  0
  •   st0le    15 年前

    尝试推翻 再PR

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

    编辑:更好的方法,多亏了保罗。

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