首页 > 解决方案 > python脚本未按预期加入字符串

问题描述

我有一个序列列表列表和一个相应的名称列表列表。

testSequences = [
    ['aaaa', 'cccc'],
    ['tt', 'gg'],
    ['AAAAAAA', 'CCCCCC', 'TTTTTT', 'GGGGGG']]
testNames = [
    ['>xx_oneFish |xzx', '>xx_twoFish |zzx'],
    ['>xx_redFish |zxx', '>xx_blueFish |zxx'],
    ['>xx_oneFish |xzx', '>xx_twoFish |xzx', '>xz_redFish |xxx', '>zx_blueFish |xzz']]

我还有一个名称的所有识别部分的列表:

taxonNames = ['oneFish', 'twoFish', 'redFish', 'blueFish']

我正在尝试生成一个新列表,其中列表中的每个项目都将对应于“名称的标识部分”之一,并且该字符串将由该名称的所有序列组成。

如果名称和序列没有出现在列表中的一个列表中(即没有redFishblueFish出现在 的第一个列表中testNames),我想添加与该列表中的序列长度相同的连字符字符串。这会给我这个输出:

['aaaa--AAAAAA', 'cccc--CCCCCC', '----ttTTTTTT', '----ggGGGG']

我有这段代码可以做到这一点。

complete = [''] * len(taxonNames)

for i in range(len(testSequences)):
    for j in range(len(taxonNames)):
        sequenceLength = len(testSequences[i][0])
        for k in range(len(testSequences[i])):
            if taxonNames[j] in testNames[i][k]:
                complete[j].join(testSequences[i][k]) 
            if taxonNames[j] not in testNames[i][k]:
                hyphenString = "-" * sequenceLength
                complete[j].join(hyphenString)

print complete

如上所述,“完成”应该给出我的最终输出,但它看起来像这样:

['', '', '', '']

如何修复我的代码以给我正确的答案?

标签: pythonstringlistloops

解决方案


您的代码的主要问题是很难理解,因为您没有真正利用使 Python 如此强大的语言元素。

这是解决您的问题的有效方法:

test_sequences = [
    ['aaaa', 'cccc'],
    ['tt', 'gg'],
    ['AAAAAAA', 'CCCCCC', 'TTTTTT', 'GGGGGG']]
test_names = [
    ['>xx_oneFish |xzx', '>xx_twoFish |zzx'],
    ['>xx_redFish |zxx', '>xx_blueFish |zxx'],
    ['>xx_oneFish |xzx', '>xx_twoFish |xzx', '>xz_redFish |xxx', '>zx_blueFish |xzz']]

taxon_names = ['oneFish', 'twoFish', 'redFish', 'blueFish']


def get_seqs(taxon_name, sequences_list, names_list):
    for seqs, names in zip(sequences_list, names_list):
        found_seq = None
        for seq, name in zip(seqs, names):
            if taxon_name in name:
                found_seq = seq
                break
        yield found_seq if found_seq else '-' * len(seqs[0])


result = [''.join(get_seqs(taxon_name, test_sequences, test_names)) 
          for taxon_name in taxon_names]

print(result)

生成器get_seqs将来自test_sequencesandtest_names和 的列表配对,尝试为匹配seq的名称 ( name) 找到序列 ( ) 并生成它,或者为该序列列表生成正确数量的连字符的字符串。

生成器(一个产生多个值的函数)的代码完全符合上面的解释。

然后,结果很简单,对于 each taxon_name,按顺序获取所有匹配的结果序列并将它们连接到一个字符串中,这就是result = ...行。

你可以让它与列表索引循环和字符串连接一起工作,但这不是 PHP 问题,现在是吗?:)

注意:为简洁起见,您可以只访问全局test_sequencestest_names不是将它们作为参数传递,但我认为如果您要实际使用此代码,那会再次困扰您。另外,我认为在整个示例中更改名称和序列的顺序具有语义意义,但我并没有避免进一步偏离您的示例。


推荐阅读