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)