python - 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']
我正在尝试生成一个新列表,其中列表中的每个项目都将对应于“名称的标识部分”之一,并且该字符串将由该名称的所有序列组成。
如果名称和序列没有出现在列表中的一个列表中(即没有redFish
或blueFish
出现在 的第一个列表中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
如上所述,“完成”应该给出我的最终输出,但它看起来像这样:
['', '', '', '']
如何修复我的代码以给我正确的答案?
解决方案
您的代码的主要问题是很难理解,因为您没有真正利用使 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
andtest_names
和 的列表配对,尝试为匹配seq
的名称 ( name
) 找到序列 ( ) 并生成它,或者为该序列列表生成正确数量的连字符的字符串。
生成器(一个产生多个值的函数)的代码完全符合上面的解释。
然后,结果很简单,对于 each taxon_name
,按顺序获取所有匹配的结果序列并将它们连接到一个字符串中,这就是result = ...
行。
你可以让它与列表索引循环和字符串连接一起工作,但这不是 PHP 问题,现在是吗?:)
注意:为简洁起见,您可以只访问全局test_sequences
而test_names
不是将它们作为参数传递,但我认为如果您要实际使用此代码,那会再次困扰您。另外,我认为在整个示例中更改名称和序列的顺序具有语义意义,但我并没有避免进一步偏离您的示例。
推荐阅读
- ios - 设置 UICollectionView 的 NumberOfItemsInSection
- java - 如何使用在我的 Windows 机器上运行的 java 代码写入 linux 中的文件?
- javascript - 获取学生id数组
- .net - .net 应用程序崩溃而没有错误
- javascript - Ace Editor 自动调整同一页面上的 2 个编辑器窗口,一个可以完美运行
- php - 使用不同的 php 脚本获取 wp_loggedin 值,然后在 Android 应用程序中返回值
- php - laravel 5.3 托管问题 - 不加载 css
- bash - 由于缺少 #!/bin/bash?
- active-directory - 如何生成 SAML 元数据文件
- angular - 侧边菜单中的图标有下划线/太大?