先抛出一些问题吧
1,Python - TypeError: 'int' object is not iterable
我的代码为
- .....
- d = list(range(len(column)))
- for i, row in enumerate(column):
- ......
- d[i] = nrow
- headers =[......]
- export(headers, d)
export 核心代码为
- tab = tablib.Dataset(*datas, headers=headers)
- with open('output_final20180403-test.csv', 'wb') as f:
- f.write(tab.xls)
tablib.Dataset 附近报错 TypeError: 'int' object is not iterable, 想来想去也想不出啥问题, 最后调试查看 d 内容, 发现有些数据类型为 list, 有些为 int , 明白过来就是 d 内容有问题.
Python: 使用 lambda 应对各种复杂情况的排序, 包括 list 嵌套 dict
一, 需要用到的函数
需要用到的函数很少, 基本上就是 sorted() 和 lambda.
sorted()
sorted() 函数原型:
- Python
- sorted(iterable[,key][,reverse])
可见 sorted() 可以接受 3 个参数, 需要排序的变量必不可少, 然后是 key 指定排序的元素, reverse 指定是否逆序.
lambda
lambda 实际上就是匿名函数
一般形式:
- Python
- lambda arguments: expression
写成函数形式就是
- Python
- def <lambda>(arguments):
- return expression
当 lambda 和 sorted() 的 key 参数结合就有意想不到的效果了.
二, 各种排序
1. 简单 list 排序
- Python
- lis = ['a', 'b', 'c']
- print(sorted(lis))
- # ['a', 'b', 'c']
- print(sorted(lis, reverse=True))
- # ['c', 'b', 'a']
2.dict 的 key 排序
- Python
- dic = {'c': 1, 'b': 2, 'a': 3}
- print(sorted(dic))
- # ['a', 'b', 'c']
- print(sorted(dic, reverse=True))
- # ['c', 'b', 'a']
3.dict 的 value 排序
- Python
- dic = {'c': 1, 'b': 2, 'a': 3}
- print(sorted(dic, key=lambda k: dic[k]))
- # ['c', 'b', 'a']
- print(sorted(dic, key=lambda k: dic[k], reverse=True))
- # ['a', 'b', 'c']
4.list 内嵌套 list 排序
- Python
- lis = [[4, 2, 9], [1, 5, 6], [7, 8, 3]]
- print(sorted(lis, key=lambda k: k[0]))
- # [[1, 5, 6], [4, 2, 9], [7, 8, 3]]
- print(sorted(lis, key=lambda k: k[1]))
- # [[4, 2, 9], [1, 5, 6], [7, 8, 3]]
- print(sorted(lis, key=lambda k: k[2]))
- # [[7, 8, 3], [1, 5, 6], [4, 2, 9]]
- print(sorted(lis, key=lambda k: k[0], reverse=True))
- # [[7, 8, 3], [4, 2, 9], [1, 5, 6]]
5.dict 内嵌套 dict 排序
- Python
- dic = {'a': {'x': 3,
- 'y': 2,
- 'z': 1
- },
- 'b': {'x': 2,
- 'y': 1,
- 'z': 3
- },
- 'c': {'x': 1,
- 'y': 3,
- 'z': 2
- },
- }
- print(sorted(dic, key = lambda k: dic[k]['x']))# ['c', 'b', 'a'] print(sorted(dic, key = lambda k: dic[k]['y']))# ['b', 'a', 'c'] print(sorted(dic, key = lambda k: dic[k]['z']))# ['a', 'c', 'b'] print(sorted(dic, key = lambda k: dic[k]['x'], reverse = True))# ['a', 'b', 'c']
6.list 内嵌套 dict 排序
- Python
- lis = [
- {'x': 3, 'y': 2, 'z': 1},
- {'x': 2, 'y': 1, 'z': 3},
- {'x': 1, 'y': 3, 'z': 2},
- ]
- print(sorted(lis, key=lambda k: k['x']))
- # [{'z': 2, 'x': 1, 'y': 3}, {'z': 3, 'x': 2, 'y': 1}, {'z': 1, 'x': 3, 'y': 2}]
- print(sorted(lis, key=lambda k: k['y']))
- # [{'z': 3, 'x': 2, 'y': 1}, {'z': 1, 'x': 3, 'y': 2}, {'z': 2, 'x': 1, 'y': 3}]
- print(sorted(lis, key=lambda k: k['z']))
- # [{'z': 1, 'x': 3, 'y': 2}, {'z': 2, 'x': 1, 'y': 3}, {'z': 3, 'x': 2, 'y': 1}]
- print(sorted(lis, key=lambda k: k['x'], reverse=True))
- # [{'z': 1, 'x': 3, 'y': 2}, {'z': 3, 'x': 2, 'y': 1}, {'z': 2, 'x': 1, 'y': 3}]
7.dict 内嵌套 list 排序
- Python
- dic = {
- 'a': [1, 2, 3],
- 'b': [2, 1, 3],
- 'c': [3, 1, 2],
- }
- print(sorted(dic, key=lambda k: dic[k][0]))
- # ['a', 'b', 'c']
- print(sorted(dic, key=lambda k: dic[k][1]))
- # ['b', 'c', 'a']
- print(sorted(dic, key=lambda k: dic[k][2]))
- # ['c', 'b', 'a']
- print(sorted(dic, key=lambda k: dic[k][0], reverse=True))
- # ['c', 'b', 'a']
三, 其他更深层嵌套排序
更深层嵌套排序方法和上面介绍的大同小异, 实际就是 lambda 的操作; 需要注意的就是 dict 的排序只会取其 key, 所以需要 lambda 首先将其转换为 value 才能操作 value 排序.
来源: http://www.bubuko.com/infodetail-2548939.html