python脚本未按预期连接字符串

python脚本未按预期连接字符串,python,string,list,loops,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'], ['&

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

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']
我正在尝试生成一个新的列表,其中列表中的每个项目将对应于“名称的标识部分”中的一个,字符串将由该名称的所有序列组成

如果一个名称和序列没有出现在列表中的一个列表中(即
testNames
的第一个列表中没有
redFish
blueFish
),我想添加一个与该列表中的序列长度相同的连字符字符串。这将为我提供以下输出:

['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
“complete”应该给出如上所述的最终输出,但结果如下:

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

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

您的代码的主要问题是您没有真正利用使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_sequences
test_names
中的列表配对,对于每一对,尝试为匹配并生成它的名称(
name
)找到序列(
name
),或者为该序列列表生成一个正确数量的连字符字符串

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

结果就是,对于每个
分类单元名称
,获取所有按顺序匹配的结果序列,并将它们连接到一个字符串中,这就是
结果=…

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


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

您的代码的主要问题是您没有真正利用使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_sequences
test_names
中的列表配对,对于每一对,尝试为匹配并生成它的名称(
name
)找到序列(
name
),或者为该序列列表生成一个正确数量的连字符字符串

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

结果就是,对于每个
分类单元名称
,获取所有按顺序匹配的结果序列,并将它们连接到一个字符串中,这就是
结果=…

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


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

这里有一个解决方案,可以满足您的需要。它不是从这篇文章的数据结构开始的,而是从你的三个示例文件(你用来构建这篇文章的数据结构)开始的

我唯一搞不清楚的是,对于一个文件中缺失的序列,要使用多少连字符

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

这里有一个解决方案,可以满足您的需求。它不是从这篇文章的数据结构开始的,而是从你的三个示例文件(你用来构建这篇文章的数据结构)开始的

我唯一搞不清楚的是,对于一个文件中缺失的序列,要使用多少连字符

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

表达式
complete[j].join(testSequences[i][k])
返回一个新字符串。您对该字符串不做任何操作,它将立即被丢弃。Python字符串是不可变的。这不会影响
complete[j]
@juanpa.arrivillaga中的
str
对象。我如何修改我的代码以便它能给我正确的答案?您需要修改列表,所以
complete[j]=complete[j]。join(testSequences[I][k])
@juanpa.arrivillaga从第9行和下删除
if not if
语句,将第8行从
complete[j].join(testSequences[i][k])
更改为
complete[j]=complete[j].join(testSequences[i][k])
给了我这样的信息:
['aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
为什么在
'aaaa--AAAAAA'
中有两个连字符,而在
'--ttTTTTTT'
中有四个连字符?表达式
complete[j]。join(testSequences[i][k])
返回一个新字符串。您对该字符串不做任何操作,它将立即被丢弃。Python字符串是不可变的。这不会影响
complete[j]
@juanpa.arrivillaga中的
str
对象。我如何修改我的代码以便它能给我正确的答案?您需要修改列表,所以
complete[j]=complete[j]。join(testSequences[I][k])
@juanpa.arrivillaga从第9行和下删除
if not if
语句,将第8行从
complete[j].join(testSequences[i][k])
更改为
complete[j]=complete[j].join(testSequences[i][k])
给出了这个结果