Python编程思想(16):压缩与排序列表

李宁老师已经在「极客起源」 微信公众号推出《Python编程思想》电子书,囊括了Python的核心技术,以及Python的主要函数库的使用方法。读者可以在「极客起源」 公众号中输入 160442 开始学习。

《Python编程思想》总目录

《Python编程思想》专栏

示例代码:func.py

使用zip()函数可以把两个列表“压缩”成一个zip对象(可迭代对象),这样可以使用一个循环并行遍历两个列表。为了测试zip()函数的功能,可以使用下面的代码:

a=['a','b','c']
b=[1,2,3]
c = [x for x in zip(a, b)]
print(c)

运行这段代码,会输出如下的结果:

[('a', 1), ('b', 2), ('c', 3)]

从上面的输出结果来看,zip()函数压缩得到的可选代对象所包含的元素是由原列表元素组成的元组。

那么如果压缩的两个列表长度不相等会怎么样呢?看下面的例子:

t1 = ['a','b','c']
t2 = [6,8]
c = [x for x in zip(t1, t2)]
print(c)

执行这段代码,输出结果如下:

[('a', 6), ('b', 8)]

从上面的输出结果可以看出,如果zip()函数压缩的两个列表长度不相等,那么zip()函数将以长度更短的列表为准。

zip()函数不仅可以压缩两个列表,也可以压缩多个列表。如下面的列表压缩了3个列表:

a=['a','b','c']
b=[1,2,3]
c=[20,40,50]
p = [x for x in zip(a,b,c)]
print(p)

这段代码的输出结果如下:

[('a', 1, 20), ('b', 2, 40), ('c', 3, 50)]

从上面代码可以看出,如果使用zip()函数压缩N个列表,那么zip()函数返回的可选代对象的元素就是长度为N的元组。

下面的代码演示了使用zip()函数来实现并行遍历的效果。

books = ['Python从菜鸟到高手', 'Python爬虫技术:深入理解原理、技术与开发', 'Flutter实战']
prices = [128, 89, 99]
# 使用zip()函数压缩两个列表,从而实现并行遍历
for book, price in zip(books, prices):
    print(f"{book}的价格是: {price}")

执行这段代码,会输出如下的结果:

Python从菜鸟到高手的价格是: 128
Python爬虫技术:深入理解原理、技术与开发的价格是: 89
Flutter实战的价格是: 99

在某些场景下,程序需要进行反向遍历,此时可通过 reversed函数,该函数可接收各种序列(元组、列表、区间等)参数,然后返回一个“反序排列”的迭代器,该函数对参数本身不会产生任何影响。看下面的代码:

a= range(10)
result = [x for x in reversed(a)]
print(result)

执行这段代码,会输出如下的结果:

[9,8,7,6,5,4,3,2,1,0]

从上面代码可以看出,通过 reversed函数得到了range(10)的反转序列。但如果再次访问a,会看到a并没有发生改变。也就是说,reversed函数只是返回反转的结果,并不会改变原始数据。

reversed函数同样也可以对列表和元组进行反转,代码如下:

data_list =['a','Python','Java',40, 12.4,51]
data_tuple =('a','Python','Java',40, 12.4,51)

result1 = [x for x in reversed(data_list)]
result2 = [x for x in reversed(data_tuple)]
print(result1)
print(result2)

执行这段代码啊,会输出如下的结果:

[51, 12.4, 40, 'Java', 'Python', 'a']
[51, 12.4, 40, 'Java', 'Python', 'a']

从输出结果可以看出,不管是列表还是元组,reversed函数的返回结果都是列表。

前面的文章提到过,字符串其实也是序列,因此也可通过该函数实现在不影响字符串本身的前提下,对字符串中的字符进行反序遍历,代码如下:

s = 'hello, lining'
result = [x for x in reversed(s)]
print(result)

执行这段代码,会输出如下的结果:

['g', 'n', 'i', 'n', 'i', 'l', ' ', ',', 'o', 'l', 'l', 'e', 'h']

与 reversed函数类似的还有 sorted函数,该函数接收一个可迭代对象作为参数,返回一个对元素排序的列表,演示代码如下:

a=[12,35,-3.2,5.3,91,3.61]
result = sorted (a)
print(result)

执行这段代码,会输出如下内容:

[-3.2, 3.61, 5.3, 12, 35, 91]

从上面的输出结果可以看出, sorted函数也不会改变所传入的可迭代对象,该函数只是返回一个新的、排序好的列表。

在使用 sorted函数时,还可传入一个 reverse参数,如果将该参数设置为True,则表示倒序排列,代码如下:

例如如下测试过程。

b=[12,35,-3.2,5.3,91,3.61]
result = sorted(b, reverse=True)
print(result)

执行这段代码的输出结果如下:

[91, 35, 12, 5.3, 3.61, -3.2]

在调用 sorted函数时,还可传入一个key参数,该参数可指定一个函数来生成排序的关键值,比如希望根据字符串长度排序,则可为key参数传入len函数,代码如下:

c = ['Android', 'ios' 'Mobile', 'Ruby','JavaScript']
result1 = sorted(c, key=len)
result2 = sorted(c, reverse=True,key=len)
print(result1)
print(result2)

这段代码的输出结果如下:

['Ruby', 'Android', 'iosMobile', 'JavaScript']
['JavaScript', 'iosMobile', 'Android', 'Ruby']

在这段代码中,result2使用了reverse参数,让c列表按字符串长度倒序排列。

对本文感兴趣的同学可以加微信unitymarvel,或扫描下面二维码加群,然后拖加入技术讨论群。

猜你喜欢

转载自blog.csdn.net/nokiaguy/article/details/106713312