【发布时间】:2016-05-29 04:18:10
【问题描述】:
从一组序列(字符串)中,我想生成一个子集字典,其中每个序列代表一个键,并且值应该是最多在“匹配”(例如 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']}
我遇到的问题是,我现在只生成一个子集,其中值与键的匹配不超过一个位置,但值序列确实有多个位置与子集中的其他值特定匹配。有没有人有这个问题的(n 优雅的)解决方案?
【问题讨论】:
-
我不确定你到底在问什么,但总的来说,在迭代列表的同时从列表中删除项目是不安全的。这会混淆迭代器变量,并可能导致某些项目看似被跳过。考虑一种不需要
for item in copy: copy.remove(item)的不同方法。 -
谢谢凯文,我现在已经改变了。这并不能解决我遇到的问题,我把它放在那里是因为我认为这样可以节省我的时间,而不必遍历在第一个循环之后我已经可以丢弃的项目。
标签: python list dynamic iterable