Python对字典列表多维数组排序

        Python的排序方法一般有两种一种是内建函数sorted 一种是列表才具有的方法sort ,sorted 是在容器外排序会生成一个新的容器,而sort仅仅是列表的一个方法,没有返回值不会生成一个新的容器。

两种方法具体实现sort、sorted 一下是源码

def sorted(iterable: Iterable[_T], *,
           key: Optional[Callable[[_T], Any]] = ...,
           reverse: bool = ...) -> List[_T]: ...

def sort(self, *, key: Optional[Callable[[_T], Any]] = ..., reverse: bool = ...) -> None: ...

1 、对简单的一维数组列表进行排序

L = [1, 2, 5, 4, 9, 8, 7, 6]  # 单列表 对L进行排序,如果参数reverse不填,默认是False递增排序-->升序.

不能直接print(L.sort()) 会返回一个None,因为sort没有返回值 返回的是None,是直接修改的元数据


L.sort()  
print("sort():", L)

LL = sorted(L, reverse=True)  # 对L再进行排序, reverse=True是递减排序也就是降序
print("sorted:", LL)

打印结果:

sort(): [1, 2, 4, 5, 6, 7, 8, 9]
sorted: [9, 8, 7, 6, 5, 4, 2, 1]

2、对多为数组进行排序类似于数据库中的行列

"""
对L2按照元组中的第二个元素进行排序,不能直接用sorted()或者L2.sort(),因为L2属于是一个多为数组了。
"""
L2 = [("a", 1), ('b', 4), ('d', 2), ('c', 3)]  # 类型与数据库的行列

# 上诉两种方法都不行,所有就要用到key值了
L2.sort(key=lambda x: x[0], reverse=True)  # 按照元组的第一个数排
print("sort():", L2)

LL2 = sorted(L2, key=lambda x: x[1], reverse=True)  # 按照元组的第二个数排
print("sorted():", LL2)

 打印结果:

sort(): [('d', 2), ('c', 3), ('b', 4), ('a', 1)]
sorted(): [('b', 4), ('c', 3), ('d', 2), ('a', 1)]

3、对列表中含有字典的列表按字典的key或者valu进行排序

import operator

"""
对L3按照字典中的年龄进行排序
"""
L3 = [{'name': '李四', 'age': 22, 'sex': '男'}, {'name': '张三', 'age': 21, 'sex': '男'},
      {'name': '李华', 'age': 30, 'sex': '女'}, {'name': '李华', 'age': 30, 'sex': '男'}]  # Json数据
# 1 使用匿名函数 lambda
L3.sort(key=lambda x: x['age'])
print(L3)

LL3 = sorted(L3, key=lambda x: x['age'])
print(LL3)
"""note 如果需要多级排序,相应调整key值 key=lambda x:(x['age'],x['sex'])"""

# 使用operator.itemgetter 函数
""" 
Return a callable object that fetches the given item(s) from its operand.
After f = itemgetter(2), the call f(r) returns r[2].
After g = itemgetter(2, 5, 3), the call g(r) returns (r[2], r[5], r[3])
"""

LLL3 = sorted(L3, key=operator.itemgetter('name'), reverse=True)
print(LLL3)

打印结果:

sort(): [{'name': '张三', 'age': 21, 'sex': '男'}, {'name': '李四', 'age': 22, 'sex': '男'}, {'name': '李华', 'age': 30, 'sex': '女'}, {'name': '李华', 'age': 30, 'sex': '男'}]
sorted() [{'name': '张三', 'age': 21, 'sex': '男'}, {'name': '李四', 'age': 22, 'sex': '男'}, {'name': '李华', 'age': 30, 'sex': '女'}, {'name': '李华', 'age': 30, 'sex': '男'}] 

4、对字典进行排序使用 key,value

因为字典是哈希散列,所以Python中的字典是无序的,sort是字典的方法,所以不可以对字典进行排序,可以使用sorted

import operator

"""
对dict1字典进行排序
"""

dict1 = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}
sorted_x = sorted(dict1.items(), key=lambda x: x[0], reverse=True)
print("lambda:", dict(sorted_x))
sorted1_x = sorted(dict1.items(), key=operator.itemgetter(0))
print("operator:", dict(sorted1_x))

打印结果:

lambda: {4: 3, 3: 4, 2: 1, 1: 2, 0: 0}
operator: {0: 0, 1: 2, 2: 1, 3: 4, 4: 3}

5、扩展:operator

要注意,operator.itemgetter函数获取的不是值,而是定义了一个函数,通过该函数作用到对象上才能获取值。

a = [1,2,3] 
b=operator.itemgetter(1)  # 定义函数b,获取对象的第1个域的值> b(a) 
2 
b=operator.itemgetter(1,0) # 定义函数b,获取对象的第1个域和第0个的值
b(a) 
(2, 1)

  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值