确定蛋白浓度(三)|自学生信Python(第二十三天)
确定蛋白浓度(三)
前面两篇文章已经介绍和讲解了问题答案代码的部分含义,下面将进行后续的讲解。(建议结合前面两篇文章阅读)
插入和删除行
在计算 Lowry 的数据时,必须首先去掉标签行。 由于该表存储为一个列表,可以使用所有列表支持的操作。 通过切片操作删去整个第一行,即保留除第一个元素以外所有其他元素 :
table = table[1:]
或者,可以使用 pop()方法:
table.pop(0)
记住,索引从 0 开始。 同样也可以删除任何其他行,如第三行
table.pop(2)
或者用切片 :
table = table[:2] + table[3:]
类似地,还可以使用列表功能在给定的位置插入新行:
table.insert(2, [0.55,0.123,0.122,0.145])
或者可以在末尾添加一个新行:
table.append([0.55,0.123,0.122,0.145])
表的添加和删除用一行代码就可以完成。
访问列
嵌套列表方法的缺点是,访问列不那么简单直接,因为一列的数据分布在所有行中。 当然,可以在表上运行一个循环来收集一列的所有数据:
protein = []
for row in table:
protein.append(row[])
如果想用这种方法提取多列或访问相同的列多次,程序将变得很长,难以阅读。 在 Python 中可以使用更有效的缩写 :
protein,ext1,ext2,ext3 = zip(table)
zip(table) 命令把每一列转换为单个元组变量,从而有效地将表旋转 90°。 此操作虽然语法很短,但需要用一些时间来才能完成。 因此对于大数据集,用 for()循环可能会更好。
合并多列
四个列都被存储在单独变量中(含有列表或元组)之后,需要把它们组合成一个两列的 表(见表 7.2) 。
加号(+)和乘法(*)运算符在 Python 中可以分别应用于列表和元组的合并和乘法。 乘法通过复制来扩展列表:
protein = protein* 3
这会导致同样的数据出现三个相连的副本 :
>>> [1,2,3] * 3
[1, 2,3,1,2,3,1,2,3]
加法将两个或多个列表或元组连接为一个:
>>> [1,2,3] + [4,5,6]
[1,2,3,4,5,6]
其结果是包含所有数据项的一个列表或元组,一个后面跟着另一个:
extinction = ext1+ ext2 + ext3
在前面的程序中,这些行的结果是通过将这三列消光值合并成一个单一的列,蛋白质列中的信息增加到原来的三倍,以包含相应的值。
问答: 如果将包含不同的数据类型的列表组合在一起会怎样? Python 并不关心乘用" 长 "运算符或连接用 " + "操作符所计算列表的内容。 例如可以轻 松地创建首先包含数字之后是字符串的列表。 但是,当要对列表中所有元素使用 for 循环或 类似 sumO这样的函数时,不同的数据类型会导致问题。如果觉得嵌套列表结构不足以达到 目的,可以考虑使用嵌套字典(见例 7. 2)或类。
zip( )函数
内置的 zip()函数和星号究竟如何工作? zip()命令可以将两个或多个列表中的元素一 个接一个地相结合,如
>>> zip( [1,2,3), [4,5,6])
[(1,4),(2,5),(3,6)]
其结果是,每个输入列表中的第一个元素配对在一起,然后是第二个元素,以此类推。 zip()函数的参数必须是可迭代的(列表,元组,字符串) 。 它返回的结果是一个包含数个元组的列表,其中第 i 个元组包含来自每个参数的第 i 个元素。 例如,前面文章代码中星号告诉 zip 函数使用嵌套列表中的所有列表作为参数,可以写为
zip (*table)
即,
zip (table [0],table [1],table [2],table [3])
将 zip() 函数的参数看成一张表中的行,zip (*table)符号将表旋转 90° :
>>> data = [[1,2,3],[4,5,6]]
>>> zip (*data)
[(1,4),(2,5),(3,6)]
总之, zip() 函数像拉链一样将列表中的各项配对,符号将所给的变量解释为每行都是参数组成的一列。zip()的一个很常见的用法是旋转(或转置)表*,这使得访 问表中的列更为轻松。
插入和删除列
zip() 函数可以 90°旋转表 :
table = zip (*table)
有了这一招,就可以像对行一样对列进行访问、插入、删除。 例如,需插入一列就要先转置表,插入一行,最后再将表转置回来 :
table =zip(table)
table.append(['ext4',0,0,0,0,0,0])
table = zip(table)
该代码添加一个额外的第一行带标签的全零列。 如果想从一个表中删除一列,可以使用同样的方法:
table =zip(table)
table.pop(1)
table = zip(table)
以上代码消除了整个第二列,但这种方法有一个小缺点, zip(*table)操作将其中的列表变 为了元组。 正如以前所述,元组是不可变的。 这意味着用了 zip()之后,不能再对单个单元格进行操作。需要将行再次转换为列表:
table [1] = list (table [1])
table [1][2] = 0.123
用这两行指令可更改 zip(*table)后的单个单元格的值。 图 7. 2 总结了可对表使用的 指令。