簡體   English   中英

python:遍歷動態列表

[英]python: iterate through dynamic list

我要從一組序列(字符串)中生成一個子集字典,其中每個序列都代表一個鍵,並且值應該是在“ match”(例如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']

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM