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()
这里有一个非常值得探讨的问题,我们已经有了列表这种数据结构,为什么还需要元组这样的类型呢?
- 元组中的元素是无法修改的,事实上我们在项目中尤其是多线程环境(后面会讲到)中可能更喜欢使用的是那些不变对象(一方面因为对象状态不能修改,所以可以避免由此引起的不必要的程序错误,简单的说就是一个不变的对象要比可变的对象更加容易维护;另一方面因为没有任何一个线程能够修改不变对象的内部状态,一个不变对象自动就是线程安全的,这样就可以省掉处理同步化的开销。一个不变对象可以方便的被共享访问)。所以结论就是:如果不需要对元素进行添加、删除、修改的时候,可以考虑使用元组,当然如果一个方法要返回多个值,使用元组也是不错的选择。
- 元组在创建时间和占用的空间上面都优于列表。
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))
上一篇: nodeJS从入门到进阶三(MongoDB数据库)
下一篇: 内存泄漏场景和内存泄漏优化