zoukankan      html  css  js  c++  java
  • Python基础 — 字符串和常用数据结构

    序言:这一章我们学习字符串、列表、元组、字典 等常用存储结构

    1. 字符串

    所谓字符串,就是由零个或多个字符组成的有限序列 ,简单来说:双引号或者单引号中的数据,就是字符串

    通过下面代码,我们来了解一下字符串的使用

    # -*- coding:utf-8 -*-
    def main():
        str1 = 'hello world!'
        #通过len 计算函数字符串的长度
        print(len(str1))
        #获得字符串首字母大写的拷贝
        print(str1.capitalize())
        #获得字符串全大写的拷贝
        print(str1.upper())
        #查询or 是否被包含str1中 包含返回索引值
        print(str1.find("or"))
        #查询and 是否被包含str1
        print(str1.find("and"))
        #index 与find类似 但是找不到会抛异常
        print(str1.index("or"))
        #print(str1.index("or"))
        #检查字符串是否以指定的字符串开头
        print(str1.startswith("he"))
        print(str1.startswith("1he"))
        #检查字符串是否以指定的字符串结尾
        print(str1.endswith("!"))
        #将字符串以指定的宽度居中 并在两边添加指定的字符
        print(str1.center(50,"*"))
        print(str1.rjust(50," "))
        str2 = "abc123456 ";
        # 字符串切片:从字符串中取出指定位置的字符
        print("str2[2]: ",str2[2])
        print("str2[2:]:",str2[2:])
        print("str2[::2]:",str2[::2])
        print("str2[::-1]:",str2[::-1])
        print("str2[-3::-1]:",str2[-3::-1])
        # 检查字符串是否由数字构成
        print(str2.isdigit())
        # 检查字符串是否由字母构成
        print(str2.isalpha())
        # 检查字符串是否由数字字母组成
        print(str2.isalnum())
        #去除两侧空格
        print(str2.strip())
    
    if  __name__ == '__main__':
        main()
    

    输出结果

    str = "helloworld"

    方法 说明 结果
    len(str) 字符串长度 10
    str.capitalize() 字符串首字母大写 Helloworld
    str.upper() 字符串全大写 HELLOWORLD
    str.find("or") 检测 "or" 是否包含在 str 中,如果是返回开始的索引值,否则返回-1 6
    str.startswith("h") 检查字符串是否以指定的字符串开头 True
    str.endswith("!") 检查字符串是否以指定的字符串结尾 False
    str.center(20,"*") 将字符串以指定的宽度居中 并在两边添加指定的字符 *****helloworld*****
    str.isdigit() 检查字符串是否由数字构成 False
    str.isalpha() 检查字符串是否由字母构成 True
    str.strip() 去除两侧空格 helloworld

    2. 列表

    列表是Python中内置有序、可变序列,列表的所有元素放在一对中括号“[]”中,并使用逗号分隔开

    列表常用方法

    方法 说明
    lst.append(x) 将元素x添加至列表lst尾部
    lst.extend(L) 将列表L中所有元素添加至列表lst尾部
    lst.insert(index, x) 在列表lst指定位置index处添加元素x,该位置后面的所有元素后移一个位置
    lst.remove(x) 在列表lst中删除首次出现的指定元素,该元素之后的所有元素前移一个位置
    lst.pop([index]) 删除并返回列表lst中下标为index(默认为-1)的元素
    lst.clear() 删除列表lst中所有元素,但保留列表对象
    lst.index(x) 返回列表lst中第一个值为x的元素的下标,若不存在值为x的元素则抛出异常
    lst.count(x) 返回指定元素x在列表lst中的出现次数
    lst.reverse() 对列表lst所有元素进行逆序
    lst.sort(key=None, reverse=False) 对列表lst中的元素进行排序,key用来指定排序依据,reverse决定升序(False),还是降序(True)
    lst.copy() 返回列表lst的浅复制

    2.1 列表的增删改查

    def main():
        list1 = [1,3,5,7,100]
        print(list1)
        list2 = ['hello'] * 5
        print(list2)
        # 计算列表的长度
        print("列表的长度为:",len(list2))
        #下标索引
        print("索引为0的元素:",list1[0])
        print("索引为3的元素:",list1[3])
        print("索引为-1的元素:",list1[-1])
        #修改元素
        list1[2] = 300
        print("修改结果:",list1)
        #添加元素
        list1.append(121)
        print("append添加元素的结果:",list1)
        list1.insert(1,676);
        print("insert插入元素的结果:",list1)
        list1 += [700,800]
        print("+=添加元素:",list1)
        #删除元素
        list1.remove(700)  #移除某个元素
        print("remove移除元素:",list1)
        list1.pop();    #移除列表最后一位元素
        print("pop移除最后一位",list1)
        del list1[0]    #移除某个下标的元素
        print("del移除:",list1)
        list1.clear() #清空列表
        print("清空后的列表:",list1)
    
    
    if __name__ == "__main__":
        main()
    

    输出结果

    2.2 列表的切片和排序

    1、列表的切片操作

    """
    列表的切片操作
    version:0.1
    author:coke
    """
    def main():
        names = ["A","B","C","D"]
        names += ["E","F","G"]
        # 循环遍历列表元素
        for name in names:
            print(name,end = " ")
        print()
        # 列表切片
        names2 = names[1:4]
        print("names2:",names2)
        # 可以完整切片操作来复制列表
        names3 = names[:]
        print("names3:",names3)
        # 可以通过反向切片操作来获得倒转后的列表的拷贝
        names4 = names[::-1]
        print("names4:",names4)
    
    if __name__ == "__main__":
        main()
    

    输出结果

    2、列表的排序操作

    """
    列表的排序操作
    version:0.1
    author:coke
    """
    def main():
        list1 = ["A","Be","C","D","E"]
        list2 = sorted(list1)
        print("list2:",list2)
        # sorted函数返回列表排序后的拷贝不会修改传入的列表
        list3 = sorted(list1,reverse=True)
        print("list3:",list3)
        # 通过key关键字参数指定根据字符串长度进行排序 而不是默认的字母表顺序
        list4 = sorted(list1,key=len)
        print("list4:",list4)
    
    if __name__ == "__main__":
        main()
    

    输出结果

    2.3 生成式语法

    我们还可以使用列表的生成式语法来创建列表

    """
    生成试语法创建列表
    version:0.1
    author:coke
    """
    import sys
    def main():
        f = [x for x in range(1,10)]
        print("f:",f)
        f = [ x + y for x in "ABCDE" for y in "1234567"]
        print("f:",f)
        #通过列表的生成表达式语法创建列表容器
        #用这种语法创建列表之后 元素已经准备就绪所有需要耗费较多的内存空间
        f = [x ** 2 for x in range(1,1000)]
        print("生成试语法:",sys.getsizeof(f)) #9024
        #print(f)
        #请注意下面的代码创建的不是一个列表 而是一个生成器对象
        #每次生成器对象可以获取到数据 但它不占用额外的空间存储数据
        #每次需要数据的时候就通过内部运算得到数据
        f = (x ** 2 for x in range(1,1000))
        print("生成器对象:",sys.getsizeof(f))
        print(f)
        """
            for val in f:
            print(val)
        print(sys.getsizeof(f))
        """
    if __name__ == "__main__":
        main()
    

    输出结果

    除了上面提到的生成器语法,Python中还有另外一种定义生成器的方式,就是通过yield关键字将一个普通函数改造成生成器函数。下面的代码演示了如何实现一个生成斐波拉切数列的生成器。所谓斐波拉切数列可以通过下面递归的方法来进行定义:

    """
    定义生成器
    version:0.1
    author:coke
    """
    def fib(n):
       a,b = 0,1
       for _ in range(n):
           a,b = b, a+b
           yield a
    def main():
       for val in fib(20):
           print(val)
    
    if __name__ == '__main__':
       main()
    
    

    3. 元组

    Python的元组与列表类似,不同之处在于元组的元素不能修改。元组使用小括号,列表使用方括号。

    def main():
       # 定义元组
       t = ('骆昊', 38, True, '四川成都')
       print(t)
       # 获取元组中的元素
       print(t[0])
       print(t[3])
       # 遍历元组中的值
       for member in t:
           print(member)
       # 重新给元组赋值
       # t[0] = '王大锤'  # TypeError
       # 变量t重新引用了新的元组原来的元组将被垃圾回收
       t = ('王大锤', 20, True, '云南昆明')
       print(t)
       # 将元组转换成列表
       person = list(t)
       print(person)
       # 列表是可以修改它的元素的
       person[0] = '李小龙'
       person[1] = 25
       print(person)
       # 将列表转换成元组
       fruits_list = ['apple', 'banana', 'orange']
       fruits_tuple = tuple(fruits_list)
       print(fruits_tuple)
    
    
    if __name__ == '__main__':
       main()
    

    这里有一个非常值得探讨的问题,我们已经有了列表这种数据结构,为什么还需要元组这样的类型呢?

    1. 元组中的元素是无法修改的,事实上我们在项目中尤其是多线程环境(后面会讲到)中可能更喜欢使用的是那些不变对象(一方面因为对象状态不能修改,所以可以避免由此引起的不必要的程序错误,简单的说就是一个不变的对象要比可变的对象更加容易维护;另一方面因为没有任何一个线程能够修改不变对象的内部状态,一个不变对象自动就是线程安全的,这样就可以省掉处理同步化的开销。一个不变对象可以方便的被共享访问)。所以结论就是:如果不需要对元素进行添加、删除、修改的时候,可以考虑使用元组,当然如果一个方法要返回多个值,使用元组也是不错的选择。
    2. 元组在创建时间和占用的空间上面都优于列表。

    4.集合

    Python中的集合跟数学上的集合是一致的,不允许有重复元素,而且可以进行交集、并集、差集等运算。

    """
    使用集合
    version:0.1
    author:coke
    """
    def  main():
        set1 = {1,2,3,3,2,4}
        print(set1)
        # len() 求集合的长度
        print('Length=',len(set1))
        set2 = set(range(1,10))
        print(set2)
        set1.add(7)
        set1.add(8)
        set2.update([11,12])
        print("set1:",set1)
        print("set2:",set2)
        # 移除元素5
        set2.discard(5)
        # remove的元素 如果不存在会引发keyError
        if 4 in set2:
            set2.remove(4)
        #遍历集合容器
        for ele in set2:
            print(ele,end=" ")
        print(" ")
        #将元组转换成集合
        set3 = set((1,2,3,4,5))
        print(set3.pop())
        print("set3:",set3)
        # 集合的交集、并集、差集、对称差运算
        print("交集:",set1 & set2)
        print("并集:",set1 | set2)
        print("差集:",set1 - set2)
        print("对称差运算:",set1 ^ set2)
        #判断子集和超集
        print("子集:",set1 <= set2)
        #print(set1.issuperset(set2))
        print("超集:",set1 >= set2)
        #print(set1.issubset(set2))
    
    if __name__ == "__main__":
        main()
    

    输出结果

    5. 字典

    字典和列表一样,也能够存储多个数据。字典的每个元素由2部分组成,键:值。例如 'name':'班长' ,'name'为键,'班长'为值

    5.1 字典的增删改查

    1、添加元素

    info = {'name':'班长', 'sex':'f', 'address':'地球亚洲中国北京'}
    # print('id为:%d'%info['id'])#程序会终端运行,因为访问了不存在的键
    newId = input('请输入新的学号:')
    info['id'] = newId
    print('添加之后的id为:',info['id'])
    

    2、修改元素

    info = {'name':'班长', 'id':100, 'sex':'f', 'address':'地球亚洲中国北京'}
    newId = input('请输入新的学号:')
    info['id'] = int(newId)
    print('修改之后的id为:',info['id'])
    

    3、删除元素

    • del 删除指定元素
    • clear() 清空整个字典
    info = {'name':'班长', 'sex':'f', 'address':'地球亚洲中国北京'}
    print("删除前:",info)
    del info['name']
    print('删除后:',info)
    info.clear()
    print("清空后:",info)
    

    4、查找某个元素

    字典在查询某个元素时,若该字典没有所查询的元素会报错,所以查询前最好进行判断

    info = {'id':1,'name':'班长', 'sex':'f', 'address':'地球亚洲中国北京'}
    print("查询:",info)
    print("查询存在的元素:",info['id'])
    #print("查询不存在的元素:",info['age'])  keyError
    print("查询不存在的元素:",info['age'] if 'age' in info else "元素不存在")
    

    5.2 字典的常见操作

    1、len():测量字典键值对的个数

    dict = {"name":"Jack","age":11}
    print(len(dict))
    

    2、 keys():返回一个包含字典所有key的列表

    dict = {"name":"Jack","age":11}
    print(dict.keys())
    

    3、values():返回一个包含字典所有value的列表

    dict = {"name":"Jack","age":11}
    print(dict.values())
    

    4、items():返回一个包含所有(键,值)元组的列表

    dict = {"name":"Jack","age":11}
    print(dict.items)
    

    5、字典遍历

    """
    字典测试
    version:0.1
    author:coke
    """
    info = {"name":"coke","age":11,"height":"198"}
    
    print("遍历字典项--------------------第一种方式")
    for item in info.items():
        print(item)
    print("遍历字典项--------------------第二种方式")
    for key,value in info.items():
        print("%s:%s"%(key,value))
    
    
  • 相关阅读:
    洛谷 P1781 宇宙总统
    洛谷 P2524 Uim的情人节礼物·其之弐(康拓展开)
    洛谷 P1123 取数游戏
    洛谷 P4147 玉蟾宫 & P1169 [ZJOI2007]棋盘制作(求最大子矩阵)
    洛谷 P1387 最大正方形 & P2701 [USACO5.3]巨大的牛棚Big Barn (求最大子正方形)
    洛谷 P1464 Function
    洛谷 P1217 [USACO1.5]回文质数 Prime Palindromes
    洛谷 P1160 队列安排
    洛谷 P1451 求细胞数量
    洛谷 P1914 小书童——密码
  • 原文地址:https://www.cnblogs.com/dwlovelife/p/11559245.html
Copyright © 2011-2022 走看看