资讯专栏INFORMATION COLUMN

python学习笔记 序列

godiscoder / 2439人阅读

内置序列

容器序列

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

    ...习 一、为什么机器学习重要 SciPyCon 2018 sklearn 教程 一、Python 机器学习简介 SciPyCon 2018 sklearn 教程 二、Python 中的科学计算工具 SciPyCon 2018 sklearn 教程 九、sklearn 估计器接口回顾 SciPyCon 2018 sklearn 教程 十五、估计器流水线 数据科学...

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

    切片是python中列表(list)、元组(tuple)、字符串(str)等序列类型都支持的一种操作,但实际上切片的功能比人们所想象的要强大的多。 切片区间为什么会忽略最后一个元素 当只有一个位置信息时,我们也可以读出该区...

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

    ...解。http://blog.jobbole.com/1321/ 和 http://blog.csdn.net/lifuxian... python内置了map和reduce函数。 map 函数 map函数接受两个参数,第一个是函数f,第二个是序列。map函数的作用就是将传入的函数作用在序列的每一个元素上,并放回一个新的序...

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

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

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

    Python学习笔记 1.List [起始:结束:步长]  步长可以为负数,要求结束>起始  倒序 a = b[::-1]  相乘 [42] * 3 = [42, 42, 42]  强制转成list list("abc") = ["a", "b", "c"]  元组,不可变的list,(2,5,6)可作为dict的key或者函数的多个返回值  可用函...

    amuqiao 评论0 收藏0

发表评论

0条评论

godiscoder

|高级讲师

TA的文章

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