python对列表,字典及对象的排序方法

python 列表,字典及对象排序相关整理

今天工作中遇到一个合并excel后需要根据每一列长度降序的方式将内容(列表嵌套)写入.其中涉及到将外层列表根据每一个嵌套列表的长度进行排序,因此回到家后整理一下python对列表以及对象排序的方法, python自带的 sort() 不在讨论范围内.

##1.列表嵌套中的排序

代码:

# –*– coding: utf-8 –*–
# @Time      : 2019/2/20 21:27
# @Author    : Damon_duanlei
# @FileName  : test.py
# @BlogsAddr : https://blog.csdn.net/Damon_duanlei

# 测试数据 名称 性别 年龄 体重
sort_list = [["臭臭", "boy", 9, 10], ["小迪", "boy", 2, 12], ["笨笨", "girl", 4, 6], ["亮亮", "boy", 2, 8]]

# 使用 sorted() 函数对指定字段排序(体重)
new_list_1 = sorted(sort_list, key=lambda dog: dog[3])  # 匿名函数指定排序字段
# 降序
new_list_2 = sorted(sort_list, key=lambda dog: dog[3], reverse=True)

print("按体重升序:{}".format(new_list_1))
print("按体重降序:{}".format(new_list_2))


运行结果:

>>>
按体重升序:[['笨笨', 'girl', 4, 6], ['亮亮', 'boy', 2, 8], ['臭臭', 'boy', 9, 10], ['小迪', 'boy', 2, 12]]
按体重降序:[['小迪', 'boy', 2, 12], ['臭臭', 'boy', 9, 10], ['亮亮', 'boy', 2, 8], ['笨笨', 'girl', 4, 6]]

2.对列表内对象排序

上述的今日工作遇到的排序问题就是使用对象排序的方法处理.首先需要根据排序依据定义一个类,添加一个实例属性用作排序依据,随后使用原始数据进行实例化,最后根据排序依据属性对实例化的对象进行排序.

代码:

# –*– coding: utf-8 –*–
# @Time      : 2019/2/20 21:27
# @Author    : Damon_duanlei
# @FileName  : test.py
# @BlogsAddr : https://blog.csdn.net/Damon_duanlei

# 测试数据 名称 性别 年龄 体重
dog_list = [["臭臭", "boy", 9, 10], ["小迪", "boy", 2, 12], ["笨笨", "girl", 4, 6], ["亮亮", "boy", 2, 8]]


# 创建一个Dog类
class Dog(object):
    def __init__(self, name, gender, age, weight):
        self.name = name
        self.gender = gender
        self.age = age
        self.weight = weight

    def __str__(self):
        return "object_{}".format(self.name)
    # Python 定义了__str__()和__repr__()两种方法,__str__()用于显示给用户,而__repr__()用于显示给开发人员。
    # 有一个偷懒的定义__repr__的方法:
    __repr__ = __str__


# 对象实例化
object_list = [Dog(dog[0], dog[1], dog[2], dog[3]) for dog in dog_list]

print("排序前顺序:{}".format(object_list))

# 对列表中的对象排序(体重)
object_list.sort(key=lambda dog: dog.weight)

print("根据体重排序后顺序:{}".format(object_list))

运行结果:

排序前顺序:[object_臭臭, object_小迪, object_笨笨, object_亮亮]
根据体重排序后顺序:[object_笨笨, object_亮亮, object_臭臭, object_小迪]

同理可以对嵌套列表的 len() 平均值 等进行排序

3.使用 operator 模块 对多个字段进行排序

代码:

# –*– coding: utf-8 –*–
# @Time      : 2019/2/20 21:27
# @Author    : Damon_duanlei
# @FileName  : test.py
# @BlogsAddr : https://blog.csdn.net/Damon_duanlei

import operator

# 测试数据 名称 性别 年龄 体重
dog_list = [["臭臭", "boy", 9, 10], ["小迪", "boy", 2, 12], ["笨笨", "girl", 4, 6], ["亮亮", "boy", 2, 8]]


# 创建一个Dog类
class Dog(object):
    def __init__(self, name, gender, age, weight):
        self.name = name
        self.gender = gender
        self.age = age
        self.weight = weight

    def __str__(self):
        return "object_{}".format(self.name)

    # Python 定义了__str__()和__repr__()两种方法,__str__()用于显示给用户,而__repr__()用于显示给开发人员。
    # 有一个偷懒的定义__repr__的方法:
    __repr__ = __str__


# 对象实例化
object_list = [Dog(dog[0], dog[1], dog[2], dog[3]) for dog in dog_list]

print("排序前顺序:{}".format(object_list))

# 对列表中的对象排序(年龄,体重)
sort_key = operator.attrgetter("age", "weight")  # 传入参数为排序属性,优先级从前往后
object_list.sort(key=sort_key)

print("根据年龄,体重排序后顺序:{}".format(object_list))

运行结果:

排序前顺序:[object_臭臭, object_小迪, object_笨笨, object_亮亮]
根据年龄,体重排序后顺序:[object_亮亮, object_小迪, object_笨笨, object_臭臭]

4.字典对 键/值 排序

python字典的定义—字典本身默认以key的字符顺序输出显示—就像我们用的真实的字典一样,按照abcd字母的顺序排列,并且本质上各自没有先后关系,是一个哈希表的结构:

但有网上资料和实际测试 python 3.6开始,字典显示的顺序与定义的过程有关,即按照定义键的顺序显示

# –*– coding: utf-8 –*–
# @Time      : 2019/3/6 21:19
# @Author    : Damon_duanlei
# @FileName  : test02.py
# @BlogsAddr : https://blog.csdn.net/Damon_duanlei

import operator

test_dict = {"name": "臭臭", "age": "9 years old", "gender": "boy", "weight": "5KG "}
print("排序前字典:{}".format(test_dict))
# 字典的 .item()方法 将字典的键值对以列表嵌套元组的形式返回
# print(test_dict.items())

after_sort = sorted(test_dict.items(), key=operator.itemgetter(0))  # itemgetter 后用圆括号() 而非中括号[]
# print(after_sort)

sort_dict = dict(after_sort)
print("排序后字典:{}".format(sort_dict))

运行结果:

>>>
排序前字典:{'name': '臭臭', 'age': '9 years old', 'gender': 'boy', 'weight': '5KG '}
排序后字典:{'age': '9 years old', 'gender': 'boy', 'name': '臭臭', 'weight': '5KG '}

你可能感兴趣的:(自学总结,python,Excel,列表排序,对象排序,字典排序)