python脚本未按预期加入字符串

时间:2019-12-03 00:19:10

标签: python string list loops

我有一个序列列表的列表,以及一个对应的名称列表的列表。

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']

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

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

['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

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

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

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

2 个答案:

答案 0 :(得分:1)

代码的主要问题是很难理解,因为您并没有真正利用使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_seqstest_sequencestest_names中的列表配对,并为每一对尝试查找名称({{1})的序列(seq)。 })匹配并产生该序列,或者产生该序列列表中正确数量的连字符的字符串。

生成器(产生多个值的函数)的代码完全按照上面的说明进行操作。

对于每个name,结果仅是一个问题,即按顺序获取所有匹配的结果序列并将它们连接在一起成为一个字符串,即taxon_name行。

您可以使其与列表索引循环和字符串连接一起使用,但这不是PHP问题,是吗? :)

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

答案 1 :(得分:1)

这是一个可以满足您需求的解决方案。它的开始不是从本文的数据结构开始,而是从previous post(用于构建本文的数据结构)中的三个示例文件开始。

我唯一想不清的是要为文件中的缺失序列使用多少个连字符。

differentNames = ['oneFish', 'twoFish', 'redFish', 'blueFish']
files = ['f1.txt', 'f2.txt', 'f3.txt']

data = [[] for _ in range(len(differentNames))]
final = []

for file in files:
    d = dict()
    with open(file, 'r') as fin:
        for line in fin:
            line = line.rstrip()
            if line.startswith('>'): # for ex., >xx_oneFish |xxx
                underscore = line.index('_')
                space = line.index(' ')
                key = line[underscore+1:space]
            else:
                d[key] = line

    for i, key in enumerate(differentNames):
        data[i].append(d.get(key, '-' * 4))

for array in data:
    final.append(''.join(array))

print(final)

打印:

['AAAAAAAaaaa----', 'CCCCCCcccc----', 'TTTTTT----tt', 'GGGGGG----gg']