前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python编程思想(16):压缩与排序列表

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

作者头像
蒙娜丽宁
发布2020-06-16 12:16:48
4920
发布2020-06-16 12:16:48
举报
文章被收录于专栏:极客起源

示例代码:func.py

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

代码语言:javascript
复制
a=['a','b','c']
b=[1,2,3]
c = [x for x in zip(a, b)]
print(c)

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

代码语言:javascript
复制
[('a', 1), ('b', 2), ('c', 3)]

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

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

代码语言:javascript
复制
t1 = ['a','b','c']
t2 = [6,8]
c = [x for x in zip(t1, t2)]
print(c)

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

代码语言:javascript
复制
[('a', 6), ('b', 8)]

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

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

代码语言:javascript
复制
a=['a','b','c']
b=[1,2,3]
c=[20,40,50]
p = [x for x in zip(a,b,c)]
print(p)

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

代码语言:javascript
复制
[('a', 1, 20), ('b', 2, 40), ('c', 3, 50)]

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

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

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

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

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

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

代码语言:javascript
复制
a= range(10)
result = [x for x in reversed(a)]
print(result)

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

代码语言:javascript
复制
[9,8,7,6,5,4,3,2,1,0]

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

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

代码语言:javascript
复制
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)

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

代码语言:javascript
复制
[51, 12.4, 40, 'Java', 'Python', 'a']
[51, 12.4, 40, 'Java', 'Python', 'a']

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

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

代码语言:javascript
复制
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函数,该函数接收一个可迭代对象作为参数,返回一个对元素排序的列表,演示代码如下:

代码语言:javascript
复制
a=[12,35,-3.2,5.3,91,3.61]
result = sorted (a)
print(result)

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

代码语言:javascript
复制
[-3.2, 3.61, 5.3, 12, 35, 91]

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

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

例如如下测试过程。

代码语言:javascript
复制
b=[12,35,-3.2,5.3,91,3.61]
result = sorted(b, reverse=True)
print(result)

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

代码语言:javascript
复制
[91, 35, 12, 5.3, 3.61, -3.2]

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

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

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

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

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

代码语言:javascript
复制
c = ['Android', 'ios' 'Mobile', 'Ruby','JavaScript']
result1 = sorted(c, key=len)
result2 = sorted(c, reverse=True,key=len)
print(result1)
print(result2)
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 极客起源 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档