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.如何做?
答案 0 :(得分:4)
使用list comprehension
,而没有lambda
,它看起来像这样:
result = max(len(x) for x in l)
基本上,这会做以下事情(它有助于从右到左分解列表理解):
in l
:遍历l
for x
:在迭代期间将l
的每个元素分配给变量x
len(x)
:获取列表x
l
的长度
list comprehensions
自然地将输出放入列表格式,所以此时我们有一个所有字符串长度的列表,如:
[5, 6, 7]
max(...)
:只是从长度列表中获取最大数字
希望这种解释有助于了解正在发生的事情。
答案 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
指定行为。