Python在生物信息学中的应用:列表推导式

列表中有一些数据,我们想提取或删除某些值,该怎么办?

解决方案

最简单的方法是使用列表推导式(list comprehension)。例如:

>>> mylist = [1, 4, -5, 10, -7, 2, 3, -1]
>>> [n for n in mylist if n > 0]
[1, 4, 10, 2, 3]
>>> [n for n in mylist if n < 0]
[-5, -7, -1]
>>>

列表推导式的使用需要注意其内存占用,当原始列表比较大时,其内存占用较高,可以使用生成器表达式通过迭代的方式产生筛选结果:

>>> pos = (n for n in mylist if n > 0)
>>> pos
<generator object <genexpr> at 0x1006a0eb0>
>>> for x in pos:
... print(x)
...
1
4
10
2
3
>>>

有时候筛选标准较为复杂,无法在列表推导式或生成器表达式中表示。比如,假设筛选过程涉及异常处理或其他一些复杂的操作。这时,可以将筛选逻辑放到单独的函数中,使用内建的 filter() 函数处理。

values = ['1', '2', '-3', '-', '4', 'N/A', '5']
def is_int(val):
    try:
        x = int(val)
        return True
    except ValueError:
        return False
ivals = list(filter(is_int, values))
print(ivals)
# Outputs ['1', '2', '-3', '4', '5']

因为 filter() 函数创建的是一个迭代器,因此如果后续需要一个列表的话,需要使用 list() 进行转换。

讨论

列表推导式和生成器表达式是筛选数据最简单的方式,其实,还可以在列表推导式中对数据做更复杂的操作,例如:

>>> mylist = [1, 4, -5, 10, -7, 2, 3, -1]
>>> import math
>>> [math.sqrt(n) for n in mylist if n > 0]
[1.0, 2.0, 3.1622776601683795, 1.4142135623730951, 1.7320508075688772]
>>>

筛选操作的另一变种形式是替换不满足条件的值,而不是丢弃它们。例如:

>>> clip_neg = [n if n > 0 else 0 for n in mylist]
>>> clip_neg
[1, 4, 0, 10, 0, 2, 3, 0]
>>> clip_pos = [n if n < 0 else 0 for n in mylist]
>>> clip_pos
[0, 0, -5, 0, -7, 0, 0, -1]
>>>

另一个值得一提的筛选工具是 itertools.compress(),它可以接受一个可迭代对象和一个布尔选择器序列作为输入。输出时,它会给出所有在相应的布尔选择器中为 True 的可迭代对象元素。例如:

addresses = [
'5412 N CLARK',
'5148 N CLARK',
'5800 E 58TH',
'2122 N CLARK',
'5645 N RAVENSWOOD',
'1060 W ADDISON',
'4801 N BROADWAY',
'1039 W GRANVILLE',
]
counts = [ 0, 3, 10, 4, 1, 7, 6, 1]

现在我们想将那些对应的 count 值大于5的地址全部输出,可以尝试以下方法:

>>> from itertools import compress
>>> more5 = [n > 5 for n in counts]
>>> more5
[False, False, True, False, False, True, True, False]
>>> list(compress(addresses, more5))
['5800 E 58TH', '1060 W ADDISON', '4801 N BROADWAY']
>>>

这里的关键是先构建一个布尔序列,用来表示哪些元素满足我们的条件。然后 compress() 函数挑选出满足布尔值为 True 的相应元素。

和 filter() 函数类似,compress() 也返回一个迭代器。因此,如果需要的话,需要使用 list() 将结果转换为列表。

参考

  • 《Python Cookbook》第三版

  • http://python3-cookbook.readthedocs.org/zh_CN/latest/

关于简说基因

  • 生信平台

    Galaxy中国(UseGalaxy.cn)致力于打造中国人的云上生物信息基础设施。大量在线工具免费使用。无需安装,用完即走。活跃的用户社区,随时交流使用心得。

  • 生信培训

    简说基因的生信培训班,荣获学员的一致好评。如果你也对生物信息学感兴趣,欢迎来跟简说基因,学真生信

  • 生信分析

    我们能够承接所有 NGS 组学数据分析业务,包括但不限于 WGS / WES / RNA-seq 等。基因组组装、注释,以及各种重测序业务都可以与简说基因合作。

  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值