资讯专栏INFORMATION COLUMN

python学习笔记 序列

godiscoder / 2646人阅读

内置序列

容器序列

list, tuple, collections.deque等这些序列能存放不同类型的数据

扁平序列

str, byte, bytearray, memoryview, array.array, 这些序列只能容纳一种类型数据

以上,容器序列存放的是他们所含任意类型对象的引用,而扁平序列存放的是值而不是引用

列表(list)是最基础也是最重要的序列类型

列表推导
>>> symbols = "中华人民共和国"
>>> codes = [ord(symbol) for symbol in symbols]
>>> codes
[20013, 21326, 20154, 27665, 20849, 21644, 22269]

列表推导由for循环变换而来,增强可读性的同时,也使得代码更加简洁

python会忽略代码里[]/()/{}中的换行,在其中可以省略续行符 ""

生成器表达式

生成器的语法和列表推导差不多,只是把方括号换成圆括号

>>> symbols = "中华人民共和国"
>>> tuple(ord(symbol) for symbol in symbols)
(20013, 21326, 20154, 27665, 20849, 21644, 22269)
>>> import array
>>> array.array("I", (ord(symbol) for symbol in symbols))
array("I", [20013, 21326, 20154, 27665, 20849, 21644, 22269])

(1) 如果生成器表达式是一个函数唯一的参数,那么这个参数不需要额外的括号
(2) array的构造方法需要两个参数,所以生成器表达式需要被括号围起来

list.sort方法和内置函数sorted

list.sort 方法的功能是将序列就地排序,即不会重新创建一个数组,将原数组复制过来

与list.sort不同的是,序列的内置函数sorted的功能虽然也是排序,但是会重新创建一个数组,不会对原数组做任何改动

>>> fruits = ["grape", "respberry", "apple", "banana"]
>>> sorted(fruits)
["apple", "banana", "grape", "respberry"]
>>> fruits
["grape", "respberry", "apple", "banana"]
>>> sorted(fruits, key=len)
["grape", "apple", "banana", "respberry"]
>>> sorted(fruits, key=len, reverse=True)
["respberry", "banana", "grape", "apple"]
>>> fruits
["grape", "respberry", "apple", "banana"]
>>> fruits.sort()
>>> fruits
["apple", "banana", "grape", "respberry"]

由以上的例子可以看出两者的差别,而sorted函数还接受key, reverse两个参数
其中,参数key表示比较的标准,而reverse表示是否要逆序(True)

利用bisect管理有序序列 利用bisect进行搜索

函数bisect(haystack, needle)可实现在haystack(干草堆,一个有序序列)中找到needle(针)的位置,该位置满足的条件是,把needle插入该函数所搜索到的位置后,整个haystack依然保持有序

import bisect
import sys
import random


haystack = [1, 4, 5, 6, 8, 12, 15, 20, 21, 23, 23, 26, 29, 30]
needles = [0, 1, 2, 5, 8, 10, 22, 23, 29, 30, 31]
row_fmt = "{0:2d} @ {1:2d}    {2}{0:<2d}"


def demo(bisect_fn):
    for needle in reversed(needles):
        position = bisect_fn(haystack, needle)
        offset = position * " |"
        print(row_fmt.format(needle, position, offset))


if __name__ == "__main__":

    if sys.argv[-1] == "left":
        bisect_fn = bisect.bisect_left
    else:
        bisect_fn = bisect.bisect_right

    print("Demo: ", bisect_fn.__name__)
    print("haystack ->", "".join("%2d" % n for n in haystack))
    demo(bisect_fn)



    print("

#################insort###############")
    size = 7
    # random.seed(1729)
    my_list = []
    for i in range(7):
        new_item = random.randrange(size * 2)
        bisect.insort(my_list, new_item)
        print("%2d ->" % new_item, my_list)
        
    #############运行结果################
Demo:  bisect_right
haystack ->  1 4 5 6 8121520212323262930
31 @ 14     | | | | | | | | | | | | | |31
30 @ 14     | | | | | | | | | | | | | |30
29 @ 13     | | | | | | | | | | | | |29
23 @ 11     | | | | | | | | | | |23
22 @  9     | | | | | | | | |22
10 @  5     | | | | |10
 8 @  5     | | | | |8
 5 @  3     | | |5
 2 @  1     |2
 1 @  1     |1
 0 @  0    0


#################insort###############
 9 -> [9]
 7 -> [7, 9]
 1 -> [1, 7, 9]
 4 -> [1, 4, 7, 9]
 5 -> [1, 4, 5, 7, 9]
12 -> [1, 4, 5, 7, 9, 12]
 5 -> [1, 4, 5, 5, 7, 9, 12]

*bisect其实是bisect_rihght函数的缩写,其返回的插入位置是原始序列与被插入元素相等元素位置的 右边 ,该函数还有一个姊妹函数bisect_left,其返回的插入位置是原始序列与被插入元素相等元素位置的 左边

书中还有推荐一个网站 Python Tutor , 是一个对python运行原理进行可视化分析的工具。

注: 以上内容主体均来自于《流畅的python》书中第2章 序列构成的数组

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/42158.html

相关文章

  • ApacheCN 人工智能知识树 v1.0

    摘要:贡献者飞龙版本最近总是有人问我,把这些资料看完一遍要用多长时间,如果你一本书一本书看的话,的确要用很长时间。为了方便大家,我就把每本书的章节拆开,再按照知识点合并,手动整理了这个知识树。 Special Sponsors showImg(https://segmentfault.com/img/remote/1460000018907426?w=1760&h=200); 贡献者:飞龙版...

    刘厚水 评论0 收藏0
  • python 学习笔记 关于切片

    摘要:我们还可以给切片进行命名,有名字的切片,显然更具有可读性。对切片赋值时,赋值符号右侧必须是一个可迭代对象,即使这个对象只包含一个元素,否则会提示错误。注以上内容主体来自于流畅的一书中切片和切片原理 切片是python中列表(list)、元组(tuple)、字符串(str)等序列类型都支持的一种操作,但实际上切片的功能比人们所想象的要强大的多。 切片区间为什么会忽略最后一个元素 当只有...

    jerryloveemily 评论0 收藏0
  • python学习笔记-map/reduce/filter/sorted

    摘要:会依次将中的数据传递到中,根据返回的或者,留下或者抛弃这个值。而对于字符串,则是根据字符串对应的码表进行排序。同时也是一个高阶函数,可以实现自定义的排序方式。 map/reduce是一种编程思想,在各个领域都有它的实践。网上有一个简单的例子解释map/reduce。比如说你需要数一下某一个图书馆中有多少本藏书。最傻瓜的做法就是排一个人从头数到尾。这样速度慢,低效。另一种方法就是先将图书...

    用户83 评论0 收藏0
  • Python入门学习笔记汇总

    摘要:导语本文章汇总了本人在学习基础之绪论篇数据结构篇函数篇面向对象篇控制流程篇和元编程篇学习笔记的链接,打算入门的朋友们可以按需查看并交流。 导语:本文章汇总了本人在学习Python基础之绪论篇、数据结构篇、函数篇、面向对象篇、控制流程篇和元编程篇学习笔记的链接,打算入门Python的朋友们可以按需查看并交流。 第一部分:绪论篇 1、Python数据模型 第二部分:数据结构篇 2、序列构成...

    U2FsdGVkX1x 评论0 收藏0
  • Python学习笔记

    摘要:学习笔记起始结束步长步长可以为负数,要求结束起始倒序相乘强制转成元组,不可变的,可作为的或者函数的多个返回值可用函数效果为插入到,找到返回,找不到返回找到返回,找不到返回,并且插入键值对,返回列表返回迭代器导入赋值序列解包三元运算如果为执 Python学习笔记 1.List [起始:结束:步长]  步长可以为负数,要求结束>起始  倒序 a = b[::-1]  相乘 [42] * 3...

    amuqiao 评论0 收藏0

发表评论

0条评论

godiscoder

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<