【问题标题】:Frequency of a regex pattern at each position of sublist子列表每个位置的正则表达式模式的频率
【发布时间】:2019-09-28 03:33:19
【问题描述】:

我有一个列表列表:

x = [[AATG, ATAT, GGCC],
     [CCTA, TCGT, AAAA],
     [TTAA, GGAT, TACA]]

列表中的字符仅是 ATCG 的组合,列表中的每个元素的长度为四个字符。内部列表的长度相等。

我想估计只有 A 和 T 的所有组合的元素的频率;例如每列中的ATAT(第一行第二列)、AAAA(第二行第三列)和TTAA(第三行第一列)。

为了调用 A 和 T 的所有组合,我使用了正则表达式:

 pattern = re.findall('[AT]{4}', key)

用于阅读列表列表

y = []
for i in range(len(x[0])):
    per.append(len([j[i] for j in x if j[i]==pattern])/len(x))
print(y)

如果我使用像“ATAT”这样的特定字符串,则此代码有效:

y = []
for i in range(len(x[0])):
    per.append(len([j[i] for j in x if j[i]=='ATAT'])/len(x))
print(y)

但它不适用于带有正则表达式的模式。可以是 re.findall 可以调用的任何东西,例如:

'[CG]{4}' for all element has C or G
'^(?=[GC]*[AT][GC]*$).{4}$' for 75% of element has G or C

预期输出:

[0.34, 0.34, 0.34]

【问题讨论】:

    标签: python regex list dictionary


    【解决方案1】:

    在 if 语句 if j[i]==pattern 中检查 j[i] 是否等于返回所有非重叠匹配的 findall 的结果。

    您可以使用if pattern.match(j[i]) re.match 代替,因为您想检查匹配是否与字符类中的内容匹配 4 次。

    x = [['AATG', 'ATAT', 'GGCC'],
         ['CCTA', 'TCGT', 'AAAA'],
         ['TTAA', 'GGAT', 'TACA']]
    
    pattern = re.compile('[AT]{4}')
    
    y = []
    for i in range(len(x[0])):
        y.append(len([j[i] for j in x if pattern.match(j[i])])/len(x))
    print(y)
    

    结果:

    [0.3333333333333333, 0.3333333333333333, 0.3333333333333333]
    

    Python demo

    【讨论】:

      【解决方案2】:

      您可以使用不带正则表达式的成员资格检查来简化检查:只需检查元素是否完全由“A”和“T”组成。

      x = [['AATG', 'ATAT', 'GGCC'],
           ['CCTA', 'TCGT', 'AAAA'],
           ['TTAA', 'GGAT', 'TACA']]
      
      members = {'A', 'T'}
      result = []
      for row in x:
          #creates a list of bools, True only if an element contains just items from members set
          element_status = [all(char in members for char in element) for element in row]
          result.append(sum(element_status)/len(element_status))
      
      print(result)
      [0.3333333333333333, 0.3333333333333333, 0.3333333333333333]
      

      要对正则表达式执行相同操作,您的模式确实有效。如果你使用 findall,你只需要使用返回的元素的长度。

      import re
      x = [['AATG', 'ATAT', 'GGCC'],
           ['CCTA', 'TCGT', 'AAAA'],
           ['TTAA', 'GGAT', 'TACA']]
      
      members = {'A', 'T'}
      pattern = '[AT]{4}'
      result = []
      for row in x:
          element_status = [len(re.findall(pattern, element)) for element in row]
          result.append(sum(element_status)/len(element_status))
      
      print(result)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-03-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-11
        • 2017-04-11
        相关资源
        最近更新 更多