Python:列表排序

list1 = [1, 2, 3, 6, 7, 2, 1, 11, 77, 3, 4]

list2 = ['1', '2', '11', '10']

list3 = ['zoo', '10', 'cat', 'blue', 'air']

升序排序

# 列表.sort() ==  list.sort(列表)
list.sort(list1)
print(list1)
list2.sort()
print(list2)
list3.sort()
print(list3)
[1, 1, 2, 2, 3, 3, 4, 6, 7, 11, 77]
['1', '10', '11', '2']
['10', 'air', 'blue', 'cat', 'zoo']

降序排序

list1.sort(reverse=True)
print(list1)
list2.sort(reverse=True)
print(list2)
list3.sort(reverse=True)
print(list3)
[77, 11, 7, 6, 4, 3, 3, 2, 2, 1, 1]
['2', '11', '10', '1']
['zoo', 'cat', 'blue', 'air', '10']

逆序,反转

list1.reverse()
print(list1)
print(list1[::-1])
print(list1)
[1, 1, 2, 2, 3, 3, 4, 6, 7, 11, 77]
[77, 11, 7, 6, 4, 3, 3, 2, 2, 1, 1]
[1, 1, 2, 2, 3, 3, 4, 6, 7, 11, 77]

列表.reverse()和list1[::-1]的区别:

1、list1.reverse()直接对list1的顺序做改变;
2、list1[::-1]不对list1产生影响,复制了一个新的列表,需要赋值给一个新的变量;

思考:
问题一: 我们发现list2的升序排序是[‘1’, ‘10’, ‘11’, ‘2’],如果升序的时候想要得到[‘1’, ‘2’, ‘10’, ‘11’]应该怎么做呢?
即python将列表内得字符串按照数字大小排序

# 将list2按照数字大小排序
list2.sort(key=int)
print(list2)
['1', '2', '10', '11']

问题二: 如果有以下列表,需要按照正确的序号排序,请问该怎么办呢

list5 = ['1、外交部召见欧盟驻华代表团团长', '7、回京升副部后 前央视名嘴再赴地方', '11、TVB老戏骨廖启智患胃癌', '2、西方倒行逆施阻挡不了中国前进', 
         '12、三星堆4号坑年代区间属于商代晚期', '3、31省份新增确诊9例 均为境外输入', '4、百度回港上市', '5、人民日报评校内减负校外增负',
         '9、核酸检测等信息将整合入健康码', '6、白宫:希望与中国加强直接对话', '10、张京临场翻译高能时刻', '8、台官员被问是不是祈雨前没沐浴']

用刚刚的list.sort(key=int)显然不行了;需要找到其他办法

import re
list5.sort(key=lambda x: int(re.findall(r"\d+", x)[0]))
print(list5)
['1、外交部召见欧盟驻华代表团团长', '2、西方倒行逆施阻挡不了中国前进', '3、31省份新增确诊9例 均为境外输入', '4、百度回港上市', '5、人民日报评校内减负校外增负', '6、白宫:希望与中国加强直接对话', '7、回京升副部后 前央视名嘴再赴地方', '8、台官员被问是不是祈雨前没沐浴', '9、核酸检测等信息将整合入健康码', '10、张京临场翻译高能时刻', '11、TVB老戏骨廖启智患胃癌', '12、三星堆4号坑年代区间属于商代晚期']

lambda可以看成一个函数,如:

def a(x):
    return int(re.findall(r"\d+", x)[0])

那么入参就是通过正则表达式找到的每个元素的首个数字(\d+),加号表示任意位数;通过首个数字排序;

拓展一:

height_data = [
    {"name": "anna", "height": 171},
    {"name": "luna", "height": 169},
    {"name": "bob", "height": 164},
    {"name": "coo", "height": 183},
    {"name": "lina", "height": 178},
]
height_data.sort(key=lambda x: x["height"])
print(height_data)
# 降序排序
height_data.sort(key=lambda x: x["height"],reverse=True)
print(height_data)
[{'name': 'ken', 'height': 164}, {'name': 'jon', 'height': 169}, {'name': 'bob', 'height': 171}, {'name': 'ann', 'height': 178}, {'name': 'yun', 'height': 183}]
[{'name': 'coo', 'height': 183}, {'name': 'lina', 'height': 178}, {'name': 'anna', 'height': 171}, {'name': 'luna', 'height': 169}, {'name': 'bob', 'height': 164}]

拓展二:

# 按照数字排序
string_data = 'avg-123-sss, vgv-345-olp, kij-113-sfc, lok-012-njh'
list_data = string_data.split(',')
list_data.sort(key=lambda x: int(re.findall(r'\d+', x)[0]))
a = ','.join(list_data)
print(a)
lok-012-njh, kij-113-sfc,avg-123-sss, vgv-345-olp