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])
给出了这个结果