从一组序列(字符串)中,我想生成一个子集字典,其中每个序列代表一个键,值应该是最多匹配的所有序列,匹配" (例如1)位置,包括原始序列(键),以及当时子集中的所有值条目。
例如,考虑长度为3的所有序列,包括" A"," C"和" G"和" T",其中一个关键的值对应该(或者可能是,因为有更多可能的方法来选择这样的一组)。
这是我提出的定义:
def pick(seq,superset):
subset = [seq]
for seq in subset:
count = 0
for item in superset:
if len([i for i, j in zip(list(seq),list(item)) if i==j])==match:
count += 1
if len(subset)==count:
subset += [''.join(item)]
return subset
我得到了什么:
{'AAA': ['AAA', 'ACC', 'ACG', 'ACT', 'AGC', 'AGG', 'AGT', 'ATC', 'ATG', 'ATT', 'CAC', 'CAG',
'CAT', 'CCA', 'CGA', 'CTA', 'GAC', 'GAG', 'GAT', 'GCA', 'GGA', 'GTA', 'TAC', 'TAG', 'TAT',
'TCA', 'TGA', 'TTA']}
我想要的是什么:
{'AAA': ['CCC','GGG','TTT','ACG','CGT','GTA','TAC']}
我遇到的问题是,我现在只生成一个子集,其中值匹配不超过一个位置与键,但值序列确实有多个位置特定匹配子集中的其他值。有没有人有这个问题的优雅解决方案?
答案 0 :(得分:0)
我将您的问题解释为"我希望获得superset
中所有项目的列表,其中0到match
匹配字符与seq
之间。但是现在我的函数会返回一个列表,其中包含完全 match
匹配字符的所有项目。此外,返回列表的第一个元素等于seq
,这是我不想要的。"
出现第一个问题是因为你使用" =="与匹配时相比,而不是"< ="。出现第二个问题是因为即使您不需要,也会初始化subset
以包含seq
。它也没有必要有两个for
循环。另外,在向列表添加项目时,请考虑使用append
而不是+=
,因为它几乎总是更有效。
def pick(seq,superset,match):
subset = []
for item in superset:
if len([i for i, j in zip(list(seq),list(item)) if i==j])<=match:
subset.append(''.join(item))
return subset
superset = [
'GGG', 'GGC', 'GGA', 'GGT', 'GCG', 'GCC', 'GCA', 'GCT', 'GAG', 'GAC', 'GAA', 'GAT', 'GTG', 'GTC', 'GTA', 'GTT',
'CGG', 'CGC', 'CGA', 'CGT', 'CCG', 'CCC', 'CCA', 'CCT', 'CAG', 'CAC', 'CAA', 'CAT', 'CTG', 'CTC', 'CTA', 'CTT',
'AGG', 'AGC', 'AGA', 'AGT', 'ACG', 'ACC', 'ACA', 'ACT', 'AAG', 'AAC', 'AAA', 'AAT', 'ATG', 'ATC', 'ATA', 'ATT',
'TGG', 'TGC', 'TGA', 'TGT', 'TCG', 'TCC', 'TCA', 'TCT', 'TAG', 'TAC', 'TAA', 'TAT', 'TTG', 'TTC', 'TTA', 'TTT'
]
seq = "AAA"
print pick(seq, superset, 1)
结果(为了清楚起见,我添加了换行符):
['GGG', 'GGC', 'GGA', 'GGT', 'GCG', 'GCC', 'GCA', 'GCT', 'GAG', 'GAC', 'GAT', 'GTG', 'GTC', 'GTA', 'GTT',
'CGG', 'CGC', 'CGA', 'CGT', 'CCG', 'CCC', 'CCA', 'CCT', 'CAG', 'CAC', 'CAT', 'CTG', 'CTC', 'CTA', 'CTT',
'AGG', 'AGC', 'AGT', 'ACG', 'ACC', 'ACT', 'ATG', 'ATC', 'ATT',
'TGG', 'TGC', 'TGA', 'TGT', 'TCG', 'TCC', 'TCA', 'TCT', 'TAG', 'TAC', 'TAT', 'TTG', 'TTC', 'TTA', 'TTT']
编辑:如果每个潜在项目还必须满足子集中每个其他现有元素的匹配条件,则可以使用all
和列表推导来检查此项。请注意,函数返回的值将取决于superset
的顺序,因为有多个不同的局部最大值可以满足条件。
def similarity(a,b):
return sum(1 for p,q in zip(a,b) if p==q)
def pick(seq, superset, match):
subset = []
for item in superset:
if similarity(item, seq) <= match and all(similarity(item, x) <= match for x in subset):
subset.append(item)
return subset
superset = [
'GGG', 'GGC', 'GGA', 'GGT', 'GCG', 'GCC', 'GCA', 'GCT', 'GAG', 'GAC', 'GAA', 'GAT', 'GTG', 'GTC', 'GTA', 'GTT',
'CGG', 'CGC', 'CGA', 'CGT', 'CCG', 'CCC', 'CCA', 'CCT', 'CAG', 'CAC', 'CAA', 'CAT', 'CTG', 'CTC', 'CTA', 'CTT',
'AGG', 'AGC', 'AGA', 'AGT', 'ACG', 'ACC', 'ACA', 'ACT', 'AAG', 'AAC', 'AAA', 'AAT', 'ATG', 'ATC', 'ATA', 'ATT',
'TGG', 'TGC', 'TGA', 'TGT', 'TCG', 'TCC', 'TCA', 'TCT', 'TAG', 'TAC', 'TAA', 'TAT', 'TTG', 'TTC', 'TTA', 'TTT'
]
seq = "AAA"
print pick(seq, superset, 1)
结果:
['GGG', 'GCC', 'GAT', 'GTA', 'CGC', 'CCG', 'CTT', 'AGT', 'ATG', 'TGA', 'TCT', 'TAG', 'TTC']