8.17 python数据结构
**数据:**是描述客观事物的符号,是计算机中可以操作的对象,是能被计算机识别,并输入给计算机处理的符号集合。数据不仅仅包括整型、实型等数值类型,还包括字符及声音、图像、视频等非数值类型。
数据结构:是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。
**python数据结构:**python的数据结构主要包括标量,字符串,列表,元组,集合以及字典等。
python中通过定义变量数据类型可以通过括号类型,例如中括号是列表,小括号是元祖,花括号是集合或者字典。也可以通过关键字,例如list,tuple,set,dict等。
表 1 python数据结构定义方式
| 数据结构 | 定义方式 | 函数定义 |
|---|---|---|
| 列表 | [1, 2, 3, 4] | list([1,2,3,4]) |
| 元组 | (1, 2, 3 , 4) | tuple([1, 2, 3, 4]) |
| 集合 | {1, 2, 3, 4, 4} | set([1, 2, 3, 4, 4]) |
| 字典 | {"a":1, "b":2, "c":3, "d":4} | a = dict([('a', 1), ('b', 2), ('c', 3)]) |
数据结构比较抽象,但是算法和数据结构是所有编程语言的灵魂。
1 标量
严格来讲标量并不算python的数据结构,如果给变量只符一个值,这些值都是标量。这些变量可以进一步构成更复杂数据结构。
# 标量的定义和赋值
a = 1 # 整型
b = 2.0 # 浮点型
c = 'hello' # 字符串
d = True # 布尔型
e = 1e-5 # 复数
在python中,字符串一定要带引号,否则就会与默认名字空间中的变量,函数或者模块名冲突。单引号与双引号都可以,但是只有双引号支持字符转移。
可以通过type函数查看变量的类型。
可以通过int,float,str函数对标量类型进行转换。
a = 1
b = 2
print(a + b)
print(str(a) + str(b))
print(float(a) / float(b))
2 字符串
2.1 获取字符串
字符串是最常见的数据类型,基因组数据属于字符串,python具有强大的字符串处理能力。可以自定义字符串,保存到变量中,也可以通过文件读入,文件读入的数据,默认就是字符串,例如读取一个包含100万个数字的文件,读进来默认是字符串类型,如果想要计算,需要将字符串转换为数字类型。
# 定义一个字符串
str1 = "GGACACCATCAACAG\n"
str2 = 'GGACACCATCAACAG'
print(str1)
print(str2)
# 从文件读取
f_object = open('pydata/test.fa', 'r')
f_object.readline()
str3 = f_object.readline()
print(str3)
f_object.close()
#通过join将列表合并为字符串
str4 = "".join(['GGA', 'CAC', 'CAT', 'CAA', 'CAG'])
print(str4)
2.2字符串中使用变量
前面print函数在打印时,通过f字符串,在字符串中插入变量的值,在引号前面加上字母f,然后将变量放在花括号内。python在显示字符串时,将每个变量替换为对应的值。这种字符串称为f字符串,f是format的简写。
first_name = 'wang'
last_name = 'tong'
full_name = f'{first_name} {last_name}'
print(full_name)
print(f'{first_name.title()} {last_name.title()}')
f字符串还可以用于格式化浮点数,通过 : 后跟 浮点数标识 ,可以实现格式化浮点数
var = 11
# 格式化浮点数
print(f'{val:.3f}')
print(f'{val:.4f}')
下面案例展示,如何格式化宽度,通过在变量后添加冒号“:”来设置宽度
for i in range(1, 11):
print(f'{i:02} {i * i:3} {i * i * i:4}')
下面案例展示如何设置字符串的宽度,使其能够右对齐
# 将输出的宽度设置为十个字符。 使用 > 符号,让输出结果右对齐。
s1 = 'a'
s2 = 'ab'
s3 = 'abc'
s4 = 'abcd'
print(f'{s1:>10}')
print(f'{s2:>10}')
print(f'{s3:>10}')
print(f'{s4:>10}')
2.3 字符串属性和方法
python是面向对象编程语言,每一种数据结构都自带大量属性和方法,通过点号可以调用方法对字符串进行处理,内置的方法可以实现各种各样的操作。
# 定义一个字符串
str1 = " GGACACCAT CAACAG\n"
# 查看数据类型
print(type(str1))
# 查看属性与方法
for i in (dir(str1)):
print(i)
下面是一些字符串操作常用案例,更多字符串操作,需要使用正则表达式进行模式匹配。
# 定义一个字符串
str1 = " GGAC ACCAT CAACAG"
str2 = 'GGA CAC CAT CAA CAG\n'
str3 = str1 + str2
# 去除左右空白
print(str3.strip())
# 切分
list1 = str3.split()
print(list1)
# 连接
str4 = "".join(list1)
print(str4)
# 小写
str5 = str4.lower()
print(str5)
# 首字母大写
print(str5.title())
# 全部大写
print(str5.upper())
# 以xx开头
print(str5.startswith('A'))
# 去xx结尾
print(str5.endswith('g'))
# 计算频数
print(str5.count('a'))
# 计算长度
print(str5.__len__())
print(len(str5))
# 搜索子串,返回索引
print(str5.upper().find('ACA'))
print(str5.upper().index('ACA'))
print(str5.upper().rindex('ACA'))
# 字符串切片
print(str5[2:12])
# 翻转
print(str5[::-1])
#排序
sorted_str5 = ''.join(sorted(str5))
print(sorted_str5)
# 遍历字符串
for i in str5[0:3].upper():
print(i)