Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 有没有办法在列表中引用对象的两个属性?_Python - Fatal编程技术网

Python 有没有办法在列表中引用对象的两个属性?

Python 有没有办法在列表中引用对象的两个属性?,python,Python,我想知道谁是物体列表中较高的运动员(物体)。如果我想打印它,我试着写下: print ("The greater height is",max(x.height for x in athletes_list),"meters.") 它显示了高个子运动员的身高,但我不知道如何通过这种方式获得他的名字,把所有的命令都放在print的身上。有没有办法做到这一点 我知道这样做是可能的: for i in athletes_list: if i.height==max(x.height for

我想知道谁是物体列表中较高的运动员(物体)。如果我想打印它,我试着写下:

print ("The greater height is",max(x.height for x in athletes_list),"meters.")
它显示了高个子运动员的身高,但我不知道如何通过这种方式获得他的名字,把所有的命令都放在print的身上。有没有办法做到这一点

我知道这样做是可能的:

for i in athletes_list:
    if i.height==max(x.height for x in athletes_list):
        print ("The taller athlete is",i.name,"with",i.height,"meters.")
这两种信息都只能在print的正文中获取吗?
抱歉英语不好。

重读你的问题。答案仍然是肯定的。使用字符串的
格式
方法:

print("The taller athlete is {0.name} with {0.height} meters.".format(max(athletes_list, key=lambda a: a.height)))

在两个值上使用
max
(高度优先):

因此,领带是按外观顺序而不是名称来解决的:

maxheight, name = attrgetter('height', 'name')(max(athletes, key=attrgetter('height')))

如果有多个运动员身高最高怎么办?您正在寻找argmax。在Python中,执行此操作的方式是
max(iterable,key=lambda x:…)
Nice point,@thefourtheye。我将试着用我在这里找到的答案和一点逻辑来得到这个解决方案。但如果有人想让路,那就太好了;)是的,他还可以对名单进行排序:
运动员\u list.sort(key=lambda a:a.height,reverse=True)
并获得第一名运动员。@LaurentPorte:当然,如果他只想要第一名运动员,排序的成本是
O(n log n)
,而
O(n)
的成本是
max
,因此,只有当他真的需要把它们全部排序时,它才有价值。@LaurentPorte plus这会改变列表,这可能会在以后产生影响,同意你的看法,我只在评论中给出另一个解决方案(这不是答案)。太棒了!谢谢!大多数开发人员并不真正理解
attrgetter
,我更喜欢用
lambda
max()
一起使用,就像在其他答案中一样。@LaurentPorte:大多数开发人员也没有正确地使用
map
(如果你用
lambda
,你很悲观,应该只使用listcomp或genexpr)。我更喜欢
attrgetter
itemgetter
,因为它们是自我记录的,并且表示“这里没有技巧”。它们也更快,并且可以很好地扩展以一次获得多个值。我只在有技巧时使用
lambda
s(例如
lambda x:x[0]、-x[2]、x[1]
,注意
x[2]
上的
-
使
itemgetter(0,2,1)
不可用,所以当我在代码中看到
lambda
s时,我知道要更仔细地检查。不值得投反对票,不错。工作起来很有魅力,但我认为这种方式比使用max()的lamba现在要复杂一些。@EduardoM:True。第二个版本的
attrgetter
毫无意义;我真的只需要存储运动员并使用
最高的.height
最高的.name
,而我只需查找每个运动员一次。我只是在这里玩得很开心。:-)
maxheight, name = attrgetter('height', 'name')(max(athletes, key=attrgetter('height')))