设为首页收藏本站

Crossin的编程教室

 找回密码
 立即加入
查看: 12666|回复: 8
打印 上一主题 下一主题

Lambda传递列表问题

[复制链接]

3

主题

0

好友

64

积分

注册会员

Rank: 2

跳转到指定楼层
楼主
发表于 2017-12-27 00:33:05 |只看该作者 |倒序浏览
本帖最后由 Aquamarine 于 2017-12-27 00:34 编辑

代码:
  1. points = [{'x': 2, 'y': 3},
  2.           {'x': 4, 'y': 1}]
  3. points.sort(key=lambda i: i['y'])
  4. print(points)
复制代码
结果:
[{'x': 4, 'y': 1}, {'x': 2, 'y': 3}]
请教下列表中的两个对象是如何交换的?
回复

使用道具 举报

6

主题

2

好友

654

积分

实习版主

Rank: 7Rank: 7Rank: 7

沙发
发表于 2017-12-27 01:10:57 |只看该作者
points是一个列表,points.sort(key=...)是对这个列表通过key来排序,
lambda i : i['y']可以看作:
def g(i):
    return i['y']
也就是提取i这个字典'y'的值
所以key = lambda i : i['y']也就是列表中 各个字典中'y'对应的值,按这个由小到大排序
回复

使用道具 举报

3

主题

0

好友

64

积分

注册会员

Rank: 2

板凳
发表于 2017-12-28 00:00:08 |只看该作者
TED 发表于 2017-12-27 01:10
points是一个列表,points.sort(key=...)是对这个列表通过key来排序,
lambda i : i['y']可以看作:
def g( ...

感谢指教,还有疑问:
①由小到大是什么决定的?
②如果将x由大到小是不是能得到同样的结果,那应该怎么写?
③整段用def该怎么写?
回复

使用道具 举报

6

主题

2

好友

654

积分

实习版主

Rank: 7Rank: 7Rank: 7

地板
发表于 2017-12-28 09:45:13 |只看该作者
Aquamarine 发表于 2017-12-28 00:00
感谢指教,还有疑问:
①由小到大是什么决定的?
②如果将x由大到小是不是能得到同样的结果,那应该怎么 ...

1. 由sort所用的排序算法决定的,可以参考下https://github.com/qiwsir/algorithm/blob/master/python_sort.md 关于sorted的介绍,没搜到关于sort 很详细的。。
2. 在这个例子里,x由大到小 和y由小到大是一样的,但如果再加些元素进这个list,那么就可能不一样了
    x由大到小的写法是points.sort(key=lambda i: i['y'],reverse=True)
3.把排序写成def 然后调用这个排序方法来对points的话:
def sortY(dic_list):
    dic_list.sort(key=lambda i: i['y'])
    print(dic_list)


points = [{'x': 2, 'y': 3},{'x': 4, 'y': 1}]
sortY(points)
回复

使用道具 举报

3

主题

0

好友

64

积分

注册会员

Rank: 2

5#
发表于 2017-12-28 23:57:23 |只看该作者
本帖最后由 Aquamarine 于 2017-12-30 21:23 编辑
TED 发表于 2017-12-28 09:45
1. 由sort所用的排序算法决定的,可以参考下https://github.com/qiwsir/algorithm/blob/master/python_so ...

感谢再次指教并给出详细解释的链接,可以看出这个思路用了取巧的方式,并不是很通用。
在lambda i: i['y']中,i是不是指代points列表中的每个字典?

另,其实我的本意是不出现lambda或者说用def来替代lambda,感觉你的实现方式,其本质还是依赖lambda。
回复

使用道具 举报

6

主题

2

好友

654

积分

实习版主

Rank: 7Rank: 7Rank: 7

6#
发表于 2017-12-29 10:22:24 |只看该作者
Aquamarine 发表于 2017-12-28 23:57
感谢再次指教并给出详细解释的链接,可以看出这个思路用了取巧的方式,并不是很通用。
在lambda i: i['y' ...
  1. points = [{'x': 2, 'y': 3},
  2.           {'x': 4, 'y': 1}]
  3. points.sort(key=lambda i: i['y'])
  4. print(points)

  5. #define alpha() to replace lambda
  6. def alpha(x):
  7.     lst = []
  8.     lst.append(x['x'])
  9.     return lst

  10. points.sort(key = alpha)
  11. print(points)
复制代码
我这儿用def alpha()来表示之前的lambda,完成以对'x'内容的排序,你看一下
*因为这里的key是被赋成了一个函数,所以正常的key = func()还不能用,不然key就等于该函数的返回值了,得把这个括号去掉,key=func
关于key的介绍链接:http://blog.csdn.net/jason_cuijiahui/article/details/72771596

回复

使用道具 举报

3

主题

0

好友

64

积分

注册会员

Rank: 2

7#
发表于 2017-12-30 22:17:13 |只看该作者
TED 发表于 2017-12-29 10:22
我这儿用def alpha()来表示之前的lambda,完成以对'x'内容的排序,你看一下
*因为这里的key是被赋成了一 ...

感谢指教,还有一点疑惑,无论是i['y']还是x['x'],[]中的内容对应字典内的Key,那么i或者x都是指向points内的字典了,是不是因为在points列表内部操作,所以程序可以正确识别?
不知我这么表达是否清楚。
回复

使用道具 举报

6

主题

2

好友

654

积分

实习版主

Rank: 7Rank: 7Rank: 7

8#
发表于 2017-12-30 22:55:32 |只看该作者
Aquamarine 发表于 2017-12-30 22:17
感谢指教,还有一点疑惑,无论是i['y']还是x['x'],[]中的内容对应字典内的Key,那么i或者x都是指向point ...

是的  points.sort() 是对points这个列表用sort(),作用的对象就是列表中的元素,也就是points内的字典
回复

使用道具 举报

3

主题

0

好友

64

积分

注册会员

Rank: 2

9#
发表于 2017-12-31 15:40:36 |只看该作者
TED 发表于 2017-12-30 22:55
是的  points.sort() 是对points这个列表用sort(),作用的对象就是列表中的元素,也就是points内的字典 ...

感谢多次耐心指教
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即加入

QQ|手机版|Archiver|Crossin的编程教室 ( 苏ICP备15063769号  

GMT+8, 2024-11-23 08:50 , Processed in 0.014480 second(s), 20 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部