如何在对象列表中找到字符串的最大长度(Python)

时间:2018-03-06 14:16:06

标签: python

class XYZ:

    def __init__(self, name, score):
        self.name = name
        self.score = score


l = []     # l is the list of objects

l.append(XYZ('Anmol', 10))
l.append(XYZ('Andrew', 200))
l.append(XYZ('Johnson', 3000))

在上面的代码中,l是包含三个对象的对象列表,每个对象都有一个名称(字符串)和一个分数(整数),那么如何才能找出该列表中名称的最大长度是多少?对象

在我们的程序中,名称的最大长度是Johnson的名称,它的长度是7.所以程序应该输出为7.如何做?

4 个答案:

答案 0 :(得分:4)

使用list comprehension,而没有lambda,它看起来像这样:

 result = max(len(x) for x in l)

基本上,这会做以下事情(它有助于从右到左分解列表理解):

  1. in l:遍历l
  2. for x:在迭代期间将l的每个元素分配给变量x
  3. len(x):获取列表x
  4. 中每个变量l的长度
  5. list comprehensions自然地将输出放入列表格式,所以此时我们有一个所有字符串长度的列表,如:

    [5, 6, 7]
    
  6. max(...):只是从长度列表中获取最大数字

  7. 希望这种解释有助于了解正在发生的事情。

答案 1 :(得分:2)

longest_xyz = max(l, key=lambda item: len(item.name))
print("The length of the longest string is ", len(longest_xyz.name))

答案 2 :(得分:2)

这是一种功能性方式:

from operator import attrgetter

result = max(map(len, map(attrgetter('name'), l)))

# 7

答案 3 :(得分:2)

这并不总是适用,但如果它是基于name长度进行比较的类逻辑的一部分,则可以实现特殊类方法__lt____eq__

class XYZ:
    def __init__(self, name, score):
        self.name = name
        self.score = score

    def __lt__(self, other):
        return len(self.name) < len(other.name)

    def __eq__(self, other):
        return self.name == other.name and self.score == other.score

结果:

l = [XYZ('Anmol', 10), XYZ('Andrew', 200), XYZ('Johnson', 3000)]

max(l).name # 'Johnson'

请注意,这样做还会为比较运算符(==<>)以及类实例的sorted指定行为。