e****e 发帖数: 52 | 1 有个list如
mylist = [['b',2.5,4],['A',1.,2],['a',1.5,1],['B',0.5,3],['a',0.5,4]]
想排序成
[['A',1.,2],['a',0.5,4],['a',1.5,1],['B',0.5,3],['b',2.5,4]]
就是说对mylist中的item list的第一item按字母顺序和先大写后小写排序,如果字母
相同,则按第二item的值大小排序。
我可以单独对字母排序,
sorted(mylist, key=lambda mylist:(str.lower(mylist[:][0]),mylist[:][0]))
得到
[['A', 1.0, 2], ['a', 1.5, 1], ['a', 0.5, 4], ['B', 0.5, 3], ['b', 2.5, 4]]
但请问怎么同时对各个item list的第二个item也按大小排序? 谢谢。 | l*********s 发帖数: 5409 | | f*******n 发帖数: 12623 | 3 sorted(mylist, key=lambda mylist:(str.lower(mylist[0]),mylist[1])) | e****e 发帖数: 52 | 4 试过了,这个等效于只对第二个item按大小排序,结果是
[['a', 0.5, 4], ['A', 1.0, 2], ['a', 1.5, 1], ['B', 0.5, 3], ['b', 2.5, 4]]
【在 f*******n 的大作中提到】 : sorted(mylist, key=lambda mylist:(str.lower(mylist[0]),mylist[1]))
| l********a 发帖数: 1154 | 5 你这个用循环写吧
不转小写的话,'B'<'a'
转小写的话,又不能保证第二个元素的顺序 | d**o 发帖数: 864 | 6 推荐用dataframe
sort函数指定多个column直接解决这个问题。
【在 e****e 的大作中提到】 : 有个list如 : mylist = [['b',2.5,4],['A',1.,2],['a',1.5,1],['B',0.5,3],['a',0.5,4]] : 想排序成 : [['A',1.,2],['a',0.5,4],['a',1.5,1],['B',0.5,3],['b',2.5,4]] : 就是说对mylist中的item list的第一item按字母顺序和先大写后小写排序,如果字母 : 相同,则按第二item的值大小排序。 : 我可以单独对字母排序, : sorted(mylist, key=lambda mylist:(str.lower(mylist[:][0]),mylist[:][0])) : 得到 : [['A', 1.0, 2], ['a', 1.5, 1], ['a', 0.5, 4], ['B', 0.5, 3], ['b', 2.5, 4]]
| z*******h 发帖数: 346 | 7 >>> sorted(mylist, key = lambda x : (x[0].lower(), x[1]))
[['a', 0.5, 4], ['A', 1.0, 2], ['a', 1.5, 1], ['B', 0.5, 3], ['b', 2.5, 4]]
【在 e****e 的大作中提到】 : 有个list如 : mylist = [['b',2.5,4],['A',1.,2],['a',1.5,1],['B',0.5,3],['a',0.5,4]] : 想排序成 : [['A',1.,2],['a',0.5,4],['a',1.5,1],['B',0.5,3],['b',2.5,4]] : 就是说对mylist中的item list的第一item按字母顺序和先大写后小写排序,如果字母 : 相同,则按第二item的值大小排序。 : 我可以单独对字母排序, : sorted(mylist, key=lambda mylist:(str.lower(mylist[:][0]),mylist[:][0])) : 得到 : [['A', 1.0, 2], ['a', 1.5, 1], ['a', 0.5, 4], ['B', 0.5, 3], ['b', 2.5, 4]]
| p**o 发帖数: 3409 | 8 >>> mylist = [['b',2.5,4],['A',1.,2],['a',1.5,1],['B',0.5,3],['a',0.5,4]]
>>> from operator import itemgetter
>>>
>>> sorted(mylist, key=itemgetter(0,1))
[['A', 1.0, 2], ['B', 0.5, 3], ['a', 0.5, 4], ['a', 1.5, 1], ['b', 2.5, 4]]
【在 e****e 的大作中提到】 : 有个list如 : mylist = [['b',2.5,4],['A',1.,2],['a',1.5,1],['B',0.5,3],['a',0.5,4]] : 想排序成 : [['A',1.,2],['a',0.5,4],['a',1.5,1],['B',0.5,3],['b',2.5,4]] : 就是说对mylist中的item list的第一item按字母顺序和先大写后小写排序,如果字母 : 相同,则按第二item的值大小排序。 : 我可以单独对字母排序, : sorted(mylist, key=lambda mylist:(str.lower(mylist[:][0]),mylist[:][0])) : 得到 : [['A', 1.0, 2], ['a', 1.5, 1], ['a', 0.5, 4], ['B', 0.5, 3], ['b', 2.5, 4]]
| p**o 发帖数: 3409 | 9 >>> sorted(mylist, key=lambda x: (x[0].lower(), x[0], x[1]))
[['A', 1.0, 2], ['a', 0.5, 4], ['a', 1.5, 1], ['B', 0.5, 3], ['b', 2.5, 4]] | e****e 发帖数: 52 | 10 最后还是用循环写了。
谢谢各位的回复。
【在 l********a 的大作中提到】 : 你这个用循环写吧 : 不转小写的话,'B'<'a' : 转小写的话,又不能保证第二个元素的顺序
| p**o 发帖数: 3409 | 11 你是在说笑么
【在 e****e 的大作中提到】 : 最后还是用循环写了。 : 谢谢各位的回复。
| e****e 发帖数: 52 | 12 没有啊.
请展开说说.
【在 p**o 的大作中提到】 : 你是在说笑么
| l********a 发帖数: 1154 | 13 pulo兄弟不是已经在9楼给出非循环写法了吗?
【在 e****e 的大作中提到】 : 没有啊. : 请展开说说.
|
|