【问题标题】:sum elements in python list if match condition如果匹配条件,则对 python 列表中的元素求和
【发布时间】:2022-11-27 00:01:24
【问题描述】:

我有一个包含不同数量元素的列表的变量:

['20', 'M', '10', 'M', '1', 'D', '14', 'M', '106', 'M']
['124', 'M', '19', 'M', '7', 'M']
['19', 'M', '131', 'M']
['3', 'M', '19', 'M', '128', 'M']
['12', 'M', '138', 'M']

变量始终是数字、字母和顺序。

我只想将连续 M 的值相加(即,如果有 D,则跳过总和):

['30', 'M', '1', 'D', '120', 'M']
['510', 'M']
['150', 'M']
['150', 'M']
['150', 'M']

附言。完整的故事是我想转换软剪辑以匹配 bam 文件,但卡在了那一步。

#!/usr/bin/python

import sys 
import pysam

bamFile = sys.argv[1];

bam = pysam.AlignmentFile(bamFile, 'rb')

for read in bam:
    cigar=read.cigarstring
    sepa = re.findall('(\d+|[A-Za-z]+)', cigar)
    
    for i in range(len(sepa)):
        if sepa[i] == 'S':
            sepa[i] = 'M'
            

【问题讨论】:

  • 你不需要正则表达式。您应该首先将列表转换为[('20', 'M',) ('10', 'M'), ('1', 'D'), ('14', 'M'), ('106', 'M')],然后查看itertools.groupby,以根据元组的第二个元素对连续运行的元组进行分组。
  • @chepner:或者,只在切片中使用步长值。

标签: python bam pysam


【解决方案1】:

您可以使用步幅,您可以使用它来获取每个第二个元素,从索引 1 开始(第一个字母):

>>> example = ['30', 'M', '1', 'D', '120', 'M']
>>> example[1::2]
['M', 'D', 'M']

您可以检查是否只有 "M" 元素:

if all(letter == "M" for letter in inputlist[1::2]):
    # sum the values

您可以使用相同的步幅技巧对值求和,从索引 0(默认值)开始,并将字符串映射到整数,以及 sum() 函数:

if all(letter == "M" for letter in inputlist[1::2]):
    summed = sum(map(int, inputlist[::2]))
    newlist = [str(summed), "M"]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-25
    • 2022-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多