• 【Python】第二章组合数据类型学习笔记


    Python组合数据类型

    概述

    1. Python中常用的组合数据类型有列表、元组、字符串、字典、集合以及range等对象也支持很多类似的操作
    2. 其操作相当于其他语言的数组,但功能更加强大。
    3. 列表、元组、字符串支持双向索引。

    推荐网址:可视化网站传送门

    1-列表

    有序可变,放在一对中括号中,并用逗号隔开。
    自动扩展收缩,一个列表中的各种元素类型可以不同,甚至可以是其他组合数据类型以及自定义类型。

    列表的创建与删除

    1. 直接等号赋值
    2. 用list()将元组、字符串、range对象等可迭代对象转化为列表
    3. del删除

    列表元素增加

    1. +,本质是创建新列表然后复制,效率差,详见上述可视化网站。
    2. append(),尾部追加,原地修改

    列表元素删除

    1. list.remove(),根据参数值删除,但是在需要删除整个列表多个元素时,删除一个后列表压缩会导致出错。
    2. del list[i],i为索引。

    切片

    1. 两个冒号分隔三个数字,第一个数字表示切片开始位置(默认为0),第二个数字表示切片结束位置(但不包括,默认为列表长度),第三个数字表示切片步长(默认为1,默认时可省略第二个冒号)
    2. 返回的是浅复制,即原列表不变。

    列表排序

    关于lambda表达式
    lambda表达式可以声明匿名函数。也可以取名。用法如下:

    >>> f=lambda x,y,z:x+y+z
    >>> f(1,2,3)
    6
    
    1. list.sort(key,reverse),原地排序。key值决定利用lambda表达式来决定排序规则,reverse决定正序或逆序。True为逆序,默认为正。
    2. 内置函数sorted(),返回新列表,原列表不变
    3. list.reverse(),原地逆序。
    4. 内置函数reversed(),逆序排列,返回迭代对象。关于迭代对象以后会讲。

    其他常用内置函数

    1. len(),返回列表元素个数
    2. max(),min(),返回最大最小元素。
    3. sum(),求和,对非数值型列表要指定start参数。用法如下
    >>> sum(range(1,11)) #1到10求和
    55
    >>> sum(range(1,11),5) #start=5,相当于5+sum(range(1,11))
    60
    

    列表推导式

    直接上例题。

    1. 国王赏米,1粒开始,64格依次翻倍。
    >>> sum([2**i for i in range(64)])
    18446744073709551615
    
    1. 筛选自然数
    >>> lst=[-1,-4,6,7.5,-2.3,9,-11]
    >>> [i for i in lst if i>0]
    [6, 7.5, 9]
    
    1. 有成绩字典,算最高最低平均分,查找所有最高分同学
    >>> average=sum(scores.values())/len(scores)
    >>> scores={"Zhang San":45,"Li Si":78,"Wang Wu":40,
    	"Zhao Liu":96,"Zhao Qi":97,"Sun Ba":90,
    	"Zheng Jiu":78,"Wu Shi":99,"Dong Shiyi":60}
    >>> higest=max(scores.values())
    >>> lowest=min(scores.values())
    >>> average=sum(scores.values())/len(scores)
    >>> higest,lowest,average
    (99, 40, 75.88888888888889)
    >>> higestPerson=[name for name,score in scores.items() if score==higest]
    >>> higestPerson
    ['Wu Shi']
    
    1. 也可使用多个循环,或者使用函数或复杂表达式
    2. 生成100以内素数
    >>> [p for p in range(2,100) if 0 not in [p%d for d in range(2,int(p**0.5)+1)]]
    [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
    

    2-元组

    和列表类似,但属于不可变序列。一旦创建不能修改其元素。
    定义方式和列表相同,放在一对圆括号当中。

    元组的创建和删除

    1. 等号赋值(包含一个元素的元组创建最后要加一个逗号)。
    2. 使用tuple函数可以把其他序列转化为元组。
    3. 可以索引和切片
    4. del删除整个元组,不能删元素。

    元组和列表的区别

    1. 不允许更改,无法添加、删除元素,可以看作list()融化元组,tuple()冻结列表。
    2. 速度比列表快,写保护更加安全,可用作字典的键,也可以作为集合的元素

    序列解包

    对多个变量同时赋值。用法如下。

    x,y,z=1,2,3#多个变量同时赋值
    v_tuple = (False, 3.5, 'exp')
    (x,y,z)=v_tuple
    x,y,z =v_tuple
    x,y,z = range(3)#可以对range对象进行序列解包
    x,y,z = map(str, range(3)) #使用可迭代的map对象进行序列解包
    a,b=b,a#交换两个变量的值
    x, y, z = sorted([1, 3, 2])#sorted()函数返回排序后的列表
    a, b, c ='ABC'#字符串也支持序列解包
    x=[1,2,3,4,5,6]
    x[:3] = map(str, range(5))#切片也支持序列解包
    

    对于列表和字典也有效

    >>>s = {'a':1, 'b':2, 'C':3}
    >>>b, c, d = s.items()
    >>>b
    ('c',3)
    >>>b, c,d=s #字典不考虑顺序
    >>>b
    'c'
    >>>b, c, d = s.values()
    >>>print(b, c, d)
    1 3 2
    

    序列解包遍历多个序列

    >>>keys = ['a', 'b', 'C', 'd']
    >>>values = [1, 2, 3, 4]
    >>>for k, v in zip(keys, values):
    	print((k,v), end=' ')
    ('a',1) ('b',2) ('c',3) ('d',4)
    

    使用序列解包遍历enumerate对象

    >>>x = ['a', 'b','c']
    >>>for i, v in enumerate(x):
    	print('The value on position {0} is {1}' .format(i,v))
    The value on position 0 is a
    The value on position 1 is b
    The value on position 2 is C
    >>>aList = [1,2,3]
    >>>bList = [4,5,6]
    >>>cList = [7,8,9]
    >>>dList = zip(aList, bList, cList)
    >>>for index, value in enumerate( dList):
    	print(index, ':' , value)
    0 : (1,4,7)
    1 : (2,5,8)
    2 : (3,6,9)
    

    python 3.5支持下列方法解包

    >>>print(*[1,2,3],4,*(5,6))
    1 2 3 4 5 6
    >>>*range(4),4
    (0,1,2,3,4)
    >>>{*range(4),4,*(5,6,7)}
    {0,1,2,3,4,5,6,7}
    >>>{'x':1,**{'y':2}}
    {'y':2,'x':1}
    

    内置函数zip

    把多个可迭代的对象中的元素压缩到一起,返回一个可迭代的zip对象。

    生成器推导式

    惰性求值,可用生成器对象的__next__()方法或内置函数next()进行遍历,也可以转化为列表或元组,或者直接将其作为迭代器对象。

    g=((i+2)**2 for i in range(10))
    

    3-字典

    无序可变,键和值用冒号分隔,元素之间用逗号分割,所有元素放在一对大括号中。字典中的键可以为任意不可变数据。
    global()返回包含当前作用域内所有全局变量和值的字典
    locals()返回包含当前作用域内所有局部变量和值的字典

    字典的创建与删除

    • 使用 = 将一个字典赋值给一个变量
    >>> a_dict = {'server': 'db.diveintopython3.org', 'database': 'mysql'}
    >>> a_dict
    {'database': 'mysql', 'server': 'db.diveintopython3.org'}
    >>> x = {} #空字典
    >>> x
    {}
    
    • 使用dict利用已有数据创建字典
    >>> keys = ['a', 'b', 'c', 'd']
    >>> values = [1, 2, 3, 4]
    >>> dictionary = dict(zip(keys, values))
    >>> dictionary
    {'a': 1, 'c': 3, 'b': 2, 'd': 4}
    >>> x = dict() #空字典
    >>> x
    {}
    
    • 使用dict根据给定的键、值创建字典
    >>> d = dict(name='Bob', age=23)
    >>> d
    {'age': 23, 'name': 'Bob'}
    
    • 以给定内容为键,创建值为空的字典
    >>> adict = dict.fromkeys(['name', 'age', 'sex'])
    >>> adict
    {'age': None, 'name': None, 'sex': None}
    
    • 可以使用del删除整个字典

    字典元素的读取

    • 以键作为下标可以读取字典元素,若键不存在则抛出异常
    >>> aDict = {'name':'Bob','age':23}
    >>> aDict['name']
    'Bob'
    >>> aDict['tel'] #键不存在,抛出异常
    Traceback (most recent call last):
    File "<pyshell#53>", line 1, in <module>
    aDict['tel']
    KeyError: 'tel'
    
    • 使用字典对象的get方法获取指定键对应的值,并且可以在键不存在的时候返回指定值。
    >>> print(aDict.get('tel'))
    None
    >>> print(aDict.get('tel', '12345678')) #返回指定值,没有增加字典元素
    '12345678‘
    >>> aDict['tel'] = aDict.get('tel', '12345678') #增加一个键值对
    >>> aDict['score'] = aDict.get('score',[])
    >>> aDict['score'].append(98)
    >>> aDict['score'].append(97)
    >>> aDict
    {'age': 23, 'score': [98, 97], 'name': 'Bob', 'tel': ‘12345678'}
    
    • 使用字典对象的items()方法可以返回字典的键、值对
    • 使用字典对象的keys()方法可以返回字典的键
    • 使用字典对象的values()方法可以返回字典的值
    >>> aDict={'name':'Bob', 'sex':'male', 'age':23}
    >>> for item in aDict.items(): #输出字典中所有元素
    		print(item)
    ('age', 23)
    ('name', 'Bob')
    ('sex', 'male')
    >>> for key in aDict: #不加特殊说明,默认输出键
    		print(key)
    age
    name
    sex
    >>> for key, value in aDict.items(): #序列解包用法
    		print(key, value)
    age 23
    name Bob
    sex male
    >>> aDict.keys() #返回所有键
    dict_keys(['name', 'sex', 'age'])
    >>> aDict.values() #返回所有值
    dict_values(['Bob', 'male', 23])
    

    字典元素的添加与修改

    • 当以指定键为下标为字典赋值时:1)若键存在,则可以修改该键的值;2)若不存在,则表示添加一个键、值对。
    >>> aDict['age'] = 37 #修改元素值
    >>> aDict
    {'age': 37, 'name': 'Bob', 'sex': 'male'}
    >>> aDict['address'] = 'Wenzhou' #增加新元素
    >>> aDict
    {'age': 37, 'address': 'Wenzhou', 'name': 'Bob', 'sex': 'male'}
    
    • 使用字典对象的update()方法将另一个字典的键、值对添加到当前字典对象。
    >>> aDict
    {'age': 37, 'score': [98, 97], 'name': 'Bob', 'sex': 'male'}
    >>> aDict.items()
    dict_items([('age', 37), ('score', [98, 97]), ('name', 'Bob'), ('sex', 'male')])
    >>> aDict.update({'a':'a','b':'b'})
    >>> aDict
    {'a': 'a', 'score': [98, 97], 'name': 'Bob', 'age': 37, 'b': 'b', 'sex': 'male'}
    
    • 使用del删除字典中指定键的元素
    >>> del aDict['tel']
    
    • 使用字典对象的clear()方法来删除字典中所有元素
    >>> aDict.clear()
    
    • 使用字典对象的pop()方法删除并返回指定键的元素
    >>> aDict.pop('name')
    
    • 使用字典对象的popitem()方法删除并返回字典中的一个元素
    >>> aDict.popitem()
    

    字典应用案例

    • 已知有一个包含一些同学成绩的字典,计算成绩的最高分、最低分、平均分,并查找所有最高分同学。
    >>> scores = {"Zhang San": 45, "Li Si": 78, "Wang Wu": 40,
    "Zhou Liu": 96,"Zhao Qi": 65, "Sun Ba": 90,
    "Zheng Jiu": 78, "Wu Shi": 99,"Dong Shiyi": 60}
    >>> highest = max(scores.values())
    >>> lowest = min(scores.values())
    >>> average = sum(scores.values())*1.0/len(scores)
    >>> highest, lowest, average
    99 40 72.33333333333333
    # 对字典,如何从值找到键?
    >>> highestPerson = [name for name, score in scores.items()
    if score == highest]
    >>> highestPerson
    ['Wu Shi']
    
    • 首先生成包含1000个随机字符的字符串,然后统计每个字符的出现次数。
    >>> import string
    >>> import random
    >>> x = string.ascii_letters + string.digits
    + string.punctuation
    >>> y = [random.choice(x) for i in range(1000)]
    >>> z = ''.join(y)
    >>> d = dict() #使用字典保存每个字符出现次数
    >>> for ch in z:
    d[ch] = d.get(ch, 0) + 1 #这里如果使用 d[ch] = d[ch]+1 会怎样?
    

    补充:jieba库的使用

    函数 描述
    jieba.cut(s) 精确模式,返回一个可迭代的数据类型
    jieba.cut(s, cut_all=True) 全模式,输出文本s中所有可能单词
    jieba.cut_for_search(s) 搜索引擎模式,适合搜索引擎建立索引的分词结果
    jieba.lcut(s) 精确模式,返回一个列表类型,建议使用
    jieba.lcut(s, cut_all=True) 全模式,返回一个列表类型,建议使用
    jieba.lcut_for_search(s) 搜索引擎模式,返回一个列表类型,建议使用
    jieba.add_word(w) 向分词词典中增加新词w
    >>>import jieba
    >>>jieba.lcut("中华人民共和国是一个伟大的国家")
    ['中华人民共和国', '是', '一个', '伟大', '的', '国家']
    >>>jieba.lcut("中华人民共和国是一个伟大的国家", cut_all=True)
    ['中华', '中华人民', '中华人民共和国', '华人', '人民', '人民共和国', '共和', '共和国', '国是', '一个', '伟大', '的', '国家']
    >>>jieba.lcut_for_search("中华人民共和国是一个伟大的国家")
    ['中华', '华人', '人民', '共和', '共和国', '中华人民共和国', '是', '一个', '伟大', '的', '国家']
    

    collections模块的Counter类介绍

    • 使用collections模块的Counter类可以快速实现这个功能,并且提供更多功能,例如查找出现次数最多的元素。
    • Counter返回counter对象,类似字典,不同于字典,可以用dict()函数转换为字典
    >>> from collections import Counter
    >>> frequences = Counter(z)
    >>> frequences.items()
    >>> frequences.most_common(1) #出现次数最多的一个字符
    [('A', 22)]
    >>> frequences.most_common(3)
    [('A', 22), (';', 18), ('`', 17)]
    

    内置函数filter()

    • 内置函数filter()将一个单参数函数作用到一个序列上,返回该序列中使得该函数返回值为True的那些元素组成的filter对象,如果指定函数为None,则返回序列中等价于True的元素。
    >>> seq = ['foo', 'x41', '?!', '***']
    >>> def func(x):
    return x.isalnum() #测试是否为字母或数字
    >>> filter(func, seq) #返回filter对象
    <filter object at 0x000000000305D898>
    >>> list(filter(func, seq)) #把filter对象转换为列表
    ['foo', 'x41']
    

    字典推导式

    >>> s = {x:x.strip() for x in (' he ', 'she ', ' I')}
    >>> s
    {' he ': 'he', ' I': 'I', 'she ': 'she'}
    >>> for k, v in s.items():
    print(k, ':', v)
    he : he
    I : I
    she : she
    
    >>> {i:str(i) for i in range(1, 5)}
    {1: '1', 2: '2', 3: '3', 4: '4'}
    >>> x = ['A', 'B', 'C', 'D']
    >>> y = ['a', 'b', 'b', 'd']
    >>> {i:j for i,j in zip(x,y)}
    {'A': 'a', 'C': 'b', 'B': 'b', 'D': 'd'}
    
  • 相关阅读:
    前端性能优化-基础认知
    AngularJS表单验证开发案例
    信息无缝滚动效果marquee
    好用的切换滑动焦点图框架jquery.superslide
    jQuery核心探究
    焦点图轮播图原理与机制
    删除数组中指定的某个元素
    伪响应式开发(PC和Mobile分离)
    18丨CentOS:操作系统级监控及常用计数器解析(下)
    17丨CentOS:操作系统级监控及常用计数器解析
  • 原文地址:https://www.cnblogs.com/charles1999/p/12526324.html
Copyright © 2020-2023  润新知