鱼C论坛

 找回密码
 立即注册
查看: 1724|回复: 7

[已解决]python一行找出猪队友

[复制链接]
发表于 2022-7-6 15:28:35 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
>>> members = {
    "鱼C工作室" : {"小甲鱼":83, "不二如是":89, "二师兄":64, "小师妹":75, "鱼小二":96},
    "复仇者联盟" : {"钢铁侠":85, "绿巨人":39, "黑寡妇":82, "鹰眼":73, "雷神":99},
    "奥特曼家族" : {"迪迦":99, "艾斯":84, "泰罗":63, "佐菲":78, "赛文":78}}
>>> 
>>> # 请在此处添加一行代码,完成题目要求,并将结果保存在变量 x 中
>>> 
>>> print(x)
['鱼C工作室:二师兄', '复仇者联盟:绿巨人', '奥特曼家族:泰罗']

答案:
x = [':'.join((i, min(members[i].items(), key = lambda x:x[1])[0])) for i in members]

>>> for i in members:
...     min(members[i].items(), key = lambda x:x[1])
... 
('二师兄', 64)
('绿巨人', 39)
('泰罗', 63)

不是很懂,不过我大概能猜测是通过key的大小来进行排列的,不过min()为什么会返回一列,不应该返回最小的吗,还有我不是很理解这里lambda x:x[1],这里的x指的是前面的吗,为什么呢,不是很清楚语法~~

希望大佬们能指点一下
最佳答案
2022-7-7 12:56:43
本帖最后由 hrpzcf 于 2022-7-7 12:59 编辑
hello? 发表于 2022-7-7 09:59
不过min(members.items(), key = lambda x:x[1])的返回值是将这些二元组按第二个参数进行从小到大返回, ...


members[i].items()
不是
members.items()

一步一步解释一下下面这个代码:
for i in members:
    min(members[i].items(), key = lambda x:x[1])

这个循环会执行 3 次 min 函数:
min(members["鱼C工作室"].items(), key = lambda x:x[1])
min(members["复仇者联盟"].items(), key = lambda x:x[1])
min(members["奥特曼家族"].items(), key = lambda x:x[1])

第一次:min(members["鱼C工作室"].items(), key = lambda x:x[1])

members["鱼C工作室"]的值就是{"小甲鱼": 83, "不二如是": 89, "二师兄": 64, "小师妹": 75, "鱼小二": 96}
members["鱼C工作室"].items()的值虽然不是列表,但是类似 [('小甲鱼', 83), ('不二如是', 89), ('二师兄', 64), ('小师妹', 75), ('鱼小二', 96)]
也就是说要取出[('小甲鱼', 83), ('不二如是', 89), ('二师兄', 64), ('小师妹', 75), ('鱼小二', 96)]中的最小值,
即 min([('小甲鱼', 83), ('不二如是', 89), ('二师兄', 64), ('小师妹', 75), ('鱼小二', 96)])
但是 min 不知道哪个是最小的,('小甲鱼', 83) 最小?还是 ('二师兄', 64) 最小?还是 ('小师妹', 75) 最小?min 不知道
这时候我们给 min 传入 key 参数: lambda x:x[1] ,告诉 min 按照  lambda x:x[1] 比较 ('小甲鱼', 83), ('不二如是', 89), ('二师兄', 64), ('小师妹', 75), ('鱼小二', 96) 这几个的大小,
lambda x:x[1] 是什么?lambda x:x[1] 可以看成
def func(x):
    return x[1]
min 会分别把 [('小甲鱼', 83), ('不二如是', 89), ('二师兄', 64), ('小师妹', 75), ('鱼小二', 96)] 里的每一项 x 传入 func 函数,得到每一项的 x[1] 即每一项的第 2 个值:83, 89, 64, 75, 96
然后比较得出结果:第三项的第二个值:64 最小,所以 min 返回第三项 ('二师兄', 64)。
剩下的 members["复仇者联盟"] 和 members["奥特曼家族"] 同理。
所以 min(members["鱼C工作室"].items(), key = lambda x:x[1]) 只返回了一项 ('二师兄', 64),你为什么会觉得 min 是从小到大返回所有的项呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-7-6 16:34:10 From FishC Mobile | 显示全部楼层

回帖奖励 +20 鱼币

所以题目是什么
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-7-6 19:44:39 | 显示全部楼层
hrpzcf 发表于 2022-7-6 16:34
所以题目是什么

就是打印出三组中分数最低的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-7-6 21:30:25 | 显示全部楼层
members = {
    "鱼C工作室" : {"小甲鱼":83, "不二如是":89, "二师兄":64, "小师妹":75, "鱼小二":96},
    "复仇者联盟" : {"钢铁侠":85, "绿巨人":39, "黑寡妇":82, "鹰眼":73, "雷神":99},
    "奥特曼家族" : {"迪迦":99, "艾斯":84, "泰罗":63, "佐菲":78, "赛文":78}}

res = [min(each, key = lambda elem: each[elem]) for each in members.values()]
print(res)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-7-6 23:24:44 | 显示全部楼层
本帖最后由 hrpzcf 于 2022-7-6 23:25 编辑
hello? 发表于 2022-7-6 19:44
就是打印出三组中分数最低的


因为 min 函数支持 min(iterable, key) 这样的调用方式,iterable 是可迭代对象,key 是一个函数,是排序方法。
在你的题目中 iterable 参数,即 xxx.items() 的值是类似这样的 [ (10, 1), (5, 5), (3, 3) ... ],
如果不传key参数,min不知道该怎么在 [ (10, 1), (5, 5), (3, 3) ] 这些东西中取最小值,
而传入key 参数后(key = lambda x:x[1]),就是告诉 min,应该以 [ (10, 1), (5, 5), (3, 3) ] 这东西的每个元组的第二项的值来比较大小,min 一看 (10, 1) 的第二项 1 在其他元组的第二项中是最小的,所以就返回 (10, 1) 了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2022-7-7 09:59:33 | 显示全部楼层
hrpzcf 发表于 2022-7-6 23:24
因为 min 函数支持 min(iterable, key) 这样的调用方式,iterable 是可迭代对象,key 是一个函数,是排 ...

不过min(members[i].items(), key = lambda x:x[1])的返回值是将这些二元组按第二个参数进行从小到大返回,而不是只返回最小的那个
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-7-7 12:56:43 | 显示全部楼层    本楼为最佳答案   
本帖最后由 hrpzcf 于 2022-7-7 12:59 编辑
hello? 发表于 2022-7-7 09:59
不过min(members.items(), key = lambda x:x[1])的返回值是将这些二元组按第二个参数进行从小到大返回, ...


members[i].items()
不是
members.items()

一步一步解释一下下面这个代码:
for i in members:
    min(members[i].items(), key = lambda x:x[1])

这个循环会执行 3 次 min 函数:
min(members["鱼C工作室"].items(), key = lambda x:x[1])
min(members["复仇者联盟"].items(), key = lambda x:x[1])
min(members["奥特曼家族"].items(), key = lambda x:x[1])

第一次:min(members["鱼C工作室"].items(), key = lambda x:x[1])

members["鱼C工作室"]的值就是{"小甲鱼": 83, "不二如是": 89, "二师兄": 64, "小师妹": 75, "鱼小二": 96}
members["鱼C工作室"].items()的值虽然不是列表,但是类似 [('小甲鱼', 83), ('不二如是', 89), ('二师兄', 64), ('小师妹', 75), ('鱼小二', 96)]
也就是说要取出[('小甲鱼', 83), ('不二如是', 89), ('二师兄', 64), ('小师妹', 75), ('鱼小二', 96)]中的最小值,
即 min([('小甲鱼', 83), ('不二如是', 89), ('二师兄', 64), ('小师妹', 75), ('鱼小二', 96)])
但是 min 不知道哪个是最小的,('小甲鱼', 83) 最小?还是 ('二师兄', 64) 最小?还是 ('小师妹', 75) 最小?min 不知道
这时候我们给 min 传入 key 参数: lambda x:x[1] ,告诉 min 按照  lambda x:x[1] 比较 ('小甲鱼', 83), ('不二如是', 89), ('二师兄', 64), ('小师妹', 75), ('鱼小二', 96) 这几个的大小,
lambda x:x[1] 是什么?lambda x:x[1] 可以看成
def func(x):
    return x[1]
min 会分别把 [('小甲鱼', 83), ('不二如是', 89), ('二师兄', 64), ('小师妹', 75), ('鱼小二', 96)] 里的每一项 x 传入 func 函数,得到每一项的 x[1] 即每一项的第 2 个值:83, 89, 64, 75, 96
然后比较得出结果:第三项的第二个值:64 最小,所以 min 返回第三项 ('二师兄', 64)。
剩下的 members["复仇者联盟"] 和 members["奥特曼家族"] 同理。
所以 min(members["鱼C工作室"].items(), key = lambda x:x[1]) 只返回了一项 ('二师兄', 64),你为什么会觉得 min 是从小到大返回所有的项呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2022-7-7 18:54:57 | 显示全部楼层
hrpzcf 发表于 2022-7-7 12:56
是不是

一步一步解释一下下面这个代码:

懂了谢谢大佬,之前确实看错了,现在明白了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-28 18:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表