python 动态列表_python:遍历动态列表

我要从一组序列(字符串)中生成一个子集字典,其中每个序列都代表一个键,并且值应该是在“匹配”(例如1)位置最多匹配的所有序列,都与原始序列(键),以及当时子集中的所有值条目。

例如,考虑由“ A”,“ C”,“ G”和“ T”组成的所有长度为3的序列,其中一个键值对应该是(或可以是,因为有更多可能的方法来选择一套)。

这是我想出的定义:

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

我遇到的问题是,我现在仅生成一个子集,其中值与键的匹配不超过一个位置,但是值序列的确与该子集中的其他值具有多个特定匹配的位置。有人对此问题有解决方案吗?

解决方案

我将您的问题解释为:“我想获取所有项目的列表,这些项目的字符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']

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值