百木园-与人分享,
就是让自己快乐。

python_字典列表嵌套的排序问题

上一篇我们聊到python 字典和列表嵌套用法,这次我们聊聊字典和列表嵌套中的排序问题,这个在python基础中不会提到,但实际经常运用,面试中也喜欢问,我们娓娓道来。

在说组合排序之前,先来看看排序有哪些函数。

排序函数

使用排序有两个可用方法,分别是sort()和sorted()。

  • sort():内置方法,会改变原来列表的排序、只适用于列表排序、所以效率高。
  • sorted():全局,可迭代任意对象(字符串,元组,列表,字典等)

sort()使用例子:

简单的使用:

>>> L = [5,8,9,3,2,7]
>>> L.sort()
>>> print(L)
[2, 3, 5, 7, 8, 9]

指定关键字的排序:

## 列表嵌套列表
>>> user = [[\'Jone\', \'181\', 30], [\'Chan\', \'175\', 26], [\'Paul\', \'178\', 22]]
>>> user.sort(key=lambda user: user[2])
>>> print(user)
[[\'Paul\', \'178\', 22], [\'Chan\', \'175\', 26], [\'Jone\', \'181\', 30]]

也可以用cmp函数实现,不过python3.0后为了语言简化和统一,已经被彻底移除,这里不再赘述。

sorted()使用例子:

排序任意对象:

>>> A = \'Python\'
>>> print(sorted(A))
[\'P\', \'h\', \'n\', \'o\', \'t\', \'y\']
>>> print(A)
Python
>>>
>>> B = (3, 6, 7, 2, 9)
>>> print(sorted(B))
[2, 3, 6, 7, 9]
>>> print(B)
(3, 6, 7, 2, 9)
>>>
>>> C = [3, 6, 7, 2, 9]
>>> print(sorted(C))
[2, 3, 6, 7, 9]
>>> print(C)
[3, 6, 7, 2, 9]
>>>

根据键值的字典排序:

## 按照键值(value)排序
>>> D = {\'a\': \'3\', \'b\': \'6\', \'c\': \'2\'}
>>> ds = sorted(D.items(), key=lambda x: x[1], reverse=True)
>>> print(ds)
[(\'b\', \'6\'), (\'a\', \'3\'), (\'c\', \'2\')]
## 按照键名(key)排序
>>> D = {\'a\': \'3\', \'b\': \'6\', \'c\': \'2\'}
>>> ds = sorted(D.items(), key=lambda x: x[0], reverse=True)
>>> print(ds)
[(\'c\', \'2\'), (\'b\', \'6\'), (\'a\', \'3\')]

几种常见的排序场景

  • 列表中嵌套字典,根据字典的值排序
  • ## 使用lambda方式
    >>> D = [{\"name\": \'张三\', \'score\': 68}, {\'name\': \'李四\', \'score\': 97}]
    >>> ds = sorted(D, key=lambda x:x[\'score\'], reverse=True)
    >>> print(ds)
    [{\'name\': \'李四\', \'score\': 97}, {\'name\': \'张三\', \'score\': 68}]
    >>>
    ## 使用operator方式
    >>> import operator
    >>> D = [{\"name\": \'张三\', \'score\': 68}, {\'name\': \'李四\', \'score\': 97}]
    >>> D.sort(key=operator.itemgetter(\'score\'), reverse=True)
    >>> print(D)
    [{\'name\': \'李四\', \'score\': 97}, {\'name\': \'张三\', \'score\': 68}]
    >>>

  • 列表中嵌套字典,键不同的情况下对值进行排序
  • 可以将列表中的字典先放入到一个大字典中,对整个字典进行排序,在排序完成后,再转换为列表包含字典的形式即可。

    >>> from operator import itemgetter
    >>> dict_list = [{\"ming\": 87}, {\"mei\": 93}, {\"hua\": 68}, {\"jon\": 75}, {\"ston\": 100}, {\"jack\": 56}]
    >>> mid_dict = {key: value for x in dict_list for key, value in x.items()}
    >>> mid_list = sorted(mid_dict.items(), key=itemgetter(1))
    >>> print(mid_list)
    [(\'jack\', 56), (\'hua\', 68), (\'jon\', 75), (\'ming\', 87), (\'mei\', 93), (\'ston\', 100)]
    >>> fin_list = [{x[0]: x[1]} for x in mid_list]
    >>> print(fin_list)
    [{\'jack\': 56}, {\'hua\': 68}, {\'jon\': 75}, {\'ming\': 87}, {\'mei\': 93}, {\'ston\': 100}]
    >>>

  • 字典嵌套字典的排序:
  • >>> D={10:{\'aa\':1,\'bb\':2},11:{\'aa\':2,\'bb\':0},12:{\'aa\':0,\'bb\':3}}
    >>> ds=sorted(D.items(), key=lambda x: x[1][\'bb\'])
    >>> print(ds)
    [(11, {\'aa\': 2, \'bb\': 0}), (10, {\'aa\': 1, \'bb\': 2}), (12, {\'aa\': 0, \'bb\': 3})]
    >>>

    ---- 钢铁 648403020@qq.com 07.22.2021

    参考文档

    python排序sort()和sorted()区别:
    https://zhuanlan.zhihu.com/p/59702850
    列表排序方法sort、sorted技巧篇:
    https://blog.csdn.net/bbbeoy/article/details/79741303
    字典 列表 嵌套 复杂排序大全:
    https://blog.csdn.net/ray_up/article/details/42084863
    列表中嵌套字典,根据字典的值排序:
    https://blog.csdn.net/Thomas0713/article/details/83028414

    来源:https://www.cnblogs.com/jiba/p/15045482.html
    图文来源于网络,如有侵权请联系删除。

    未经允许不得转载:百木园 » python_字典列表嵌套的排序问题

    相关推荐

    • 暂无文章