【问题标题】:boolean valued function in pythonpython中的布尔值函数
【发布时间】:2021-12-06 06:41:04
【问题描述】:

函数 (filteredFastaToYear) 使用了另一个不起作用的布尔值函数 (filterHeaderToYear)。非常感谢您的帮助:

我有以下任务:

我给我的第一个函数 (filteredFastaToYear) 两个列表:

sequences_inp = ['ABC', 'DEF', 'GHI', 'JKL', 'MNO']  
headers_inp = ['2019-9', '2021-2', '2020-1', '2021-5', '2021-8']

作为输出,我只需要 2021 年的标题和所属序列:

sequences_out = ['DEF', 'JKL', 'MNO']  
headers_out = ['2021', '2021', '2021']

我输入:

sequences_out, headers_out = filteredFastaToYear('2021', sequences_inp, headers_inp)
print(len(sequences_out), len(headers_out))

但是输入了预期的输出,我得到了空列表:

output: 0 0
expected output: 3 3

函数filteredFastaToYear:创建两个过滤列表

def filteredFastaToYear(year, listOfSequences, listOfHeaders):

    """ output filtered sequence list, header list """
    filtListOfSequences = []
    filtListOfHeaders = []

    """ fasta filtering """
    for i in range(0, len(listOfHeaders)-1):
        if filterHeaderToYear(year, listOfHeaders[i]) == year:
            filtListOfSequences.append(listOfSequences[i])
            filtListOfHeaders.append(listOfHeaders[i])

    return filtListOfSequences, filtListOfHeaders

函数filterHeaderToYear:从所需年份中选择标题:

def filterHeaderToYear(year, listOfHeaders):

    """ split header, find the needed year """
    for header in listOfHeaders:
        header_split = header.split('-')
        if header_split[0] == year:
            return True

    return False

【问题讨论】:

  • 有什么问题?
  • 如果您对其中一个功能有疑问,请保留该功能,并删除其他所有功能。说出函数得到什么作为输入,输出是什么,以及预期的输出是什么。这样就不会有任何不必要的信息,只有问题核心
  • filterHeaderToYear 说它需要listOfHeaders,但你传递它listOfHeaders[i] - 一个日期。这两个函数中只有一个应该遍历完整的标题列表,而不是两个。
  • ldate_split 已使用但未定义。是不是打错字了?

标签: python function boolean boolean-operations


【解决方案1】:

您可以省去寻找 bug 的时间,然后这样做:

out = [(s, h[:4]) for s, h in zip(sequences_inp, headers_inp) if h[:4] == '2021']

要将对列表“解压缩”到所需的两个列表中,请使用 zip(* ) 技巧:

s, h = list(zip(*out))

【讨论】:

    【解决方案2】:

    您在代码中拆分输入年份本身

        for header in listOfHeaders:
            header_split = header.split('-')
    

    这会将2021-19 拆分为[2,0,2,1,-,1,9] 此外,您已在 if filterHeaderToYear(year, listOfHeaders[i]) == year 进行检查,因为方法返回 TrueFalse 并且您正在与 year 进行比较,所以它永远不会执行。

    另外,您并没有通过这样做来迭代完整列表

    for i in range(0, len(listOfHeaders) - 1)
    

    它将在最后一个位置之前停止一个位置。

    试试这个代码

    def filteredFastaToYear(year, listOfSequences, listOfHeaders):
        """ output filtered sequence list, header list """
        filtListOfSequences = []
        filtListOfHeaders = []
    
        """ fasta filtering """
        for i in range(0, len(listOfHeaders)):
            if filterHeaderToYear(year, listOfHeaders[i]):
                filtListOfSequences.append(listOfSequences[i])
                filtListOfHeaders.append(listOfHeaders[i])
    
        return filtListOfSequences, filtListOfHeaders
    
    def filterHeaderToYear(year, listOfHeaders):
    
        """ split header, find the needed year """
        header_split = listOfHeaders.split('-')
        if header_split[0] == year:
            return True
    
        return False
    
    sequences_inp = ['ABC', 'DEF', 'GHI', 'JKL', 'MNO']
    headers_inp = ['2019-9', '2021-2', '2020-1', '2021-5', '2021-8']
    
    sequences_out, headers_out = filteredFastaToYear('2021', sequences_inp, headers_inp)
    print(len(sequences_out), len(headers_out)) # 3,3
    
    

    【讨论】:

      猜你喜欢
      • 2021-11-28
      • 1970-01-01
      • 1970-01-01
      • 2015-09-05
      • 2019-01-19
      • 2017-07-22
      • 2016-04-26
      • 2017-05-03
      • 1970-01-01
      相关资源
      最近更新 更多