Crossin的编程教室

标题: Lambda传递列表问题 [打印本页]

作者: Aquamarine    时间: 2017-12-27 00:33
标题: Lambda传递列表问题
本帖最后由 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}]
请教下列表中的两个对象是如何交换的?
作者: TED    时间: 2017-12-27 01:10
points是一个列表,points.sort(key=...)是对这个列表通过key来排序,
lambda i : i['y']可以看作:
def g(i):
    return i['y']
也就是提取i这个字典'y'的值
所以key = lambda i : i['y']也就是列表中 各个字典中'y'对应的值,按这个由小到大排序

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

感谢指教,还有疑问:
①由小到大是什么决定的?
②如果将x由大到小是不是能得到同样的结果,那应该怎么写?
③整段用def该怎么写?
作者: TED    时间: 2017-12-28 09:45
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)

作者: Aquamarine    时间: 2017-12-28 23:57
本帖最后由 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。
作者: TED    时间: 2017-12-29 10:22
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


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

感谢指教,还有一点疑惑,无论是i['y']还是x['x'],[]中的内容对应字典内的Key,那么i或者x都是指向points内的字典了,是不是因为在points列表内部操作,所以程序可以正确识别?
不知我这么表达是否清楚。
作者: TED    时间: 2017-12-30 22:55
Aquamarine 发表于 2017-12-30 22:17
感谢指教,还有一点疑惑,无论是i['y']还是x['x'],[]中的内容对应字典内的Key,那么i或者x都是指向point ...

是的  points.sort() 是对points这个列表用sort(),作用的对象就是列表中的元素,也就是points内的字典
作者: Aquamarine    时间: 2017-12-31 15:40
TED 发表于 2017-12-30 22:55
是的  points.sort() 是对points这个列表用sort(),作用的对象就是列表中的元素,也就是points内的字典 ...

感谢多次耐心指教




欢迎光临 Crossin的编程教室 (https://bbs.crossincode.com/) Powered by Discuz! X2.5