0

次の情報を保持する辞書 (「プライマー名」と呼ばれる) のリストがあります。

{'part number': 1, 'notes': 'Fw Gibson primer on pEM113 to extract CmR resistance and pSC101 backbone and T7 promoter and term.', 'direction': 'fw primer', 'construct': '24', 'source': 'pEM113'}
{'part number': 1, 'notes': 'Re Gibson primer on pEM113 to extract CmR resistance and pSC101 backbone and T7 promoter and term.', 'direction': 're primer', 'construct': '24', 'source': 'pEM113'}
{'part number': 2, 'notes': 'Fw Gibson primer on BBa_K274100 to extract crtEBI operon', 'direction': 'fw primer', 'construct': '24', 'source': 'BBa_K274100'}
{'part number': 2, 'notes': 'Re Gibson primer on BBa_K274100 to extract crtEBI operon', 'direction': 're primer', 'construct': '24', 'source': 'BBa_K274100'}
{'part number': 1, 'notes': 'Fw Gibson primer on pEM114 to extract CmR resistance and pSC101 backbone and K1F promoter and term.', 'direction': 'fw primer', 'construct': '25', 'source': 'pEM114'}
{'part number': 1, 'notes': 'Re Gibson primer on pEM114 to extract CmR resistance and pSC101 backbone and K1F promoter and term.', 'direction': 're primer', 'construct': '25', 'source': 'pEM114'}

次の情報を保持する辞書 (「プライマー シーケンス」と呼ばれる) の別のリストがあります。

{'Part Number': '1', 'Construct Number': '24', 'Direction': 're primer', 'Primer Sequence': 'agaccgtcatctagtacctcTCTCCCTATAGTGAGTCGTATTACTCTAGAAGCGGCCGCg'}
{'Part Number': '1', 'Construct Number': '24', 'Direction': 'fw primer', 'Primer Sequence': 'tggaggatctgatataataaTAGCATAACCCCTTGGGGCCTCTAAACGGGTCTTGAGGGG'}
{'Part Number': '2', 'Construct Number': '24', 'Direction': 'fw primer', 'Primer Sequence': 'TACGACTCACTATAGGGAGAgaggtactagatgacggtctgcgcaaaaaaacacgttcat'}
{'Part Number': '2', 'Construct Number': '24', 'Direction': 're primer', 'Primer Sequence': 'GGCCCCAAGGGGTTATGCTAttattatatcagatcctccagcatcaaacctgctgtcgct'}
{'Part Number': '1', 'Construct Number': '25', 'Direction': 're primer', 'Primer Sequence': 'agaccgtcatctagtacctcTCTCCCTATAGTGATAGTTATTACTCTAGAAGCGGCCGCg'}
{'Part Number': '1', 'Construct Number': '25', 'Direction': 'fw primer', 'Primer Sequence': 'tggaggatctgatataataaTAGCATAACCCCTTGGGGCCTCTAAACGGGTCTTGAGGGG'}
{'Part Number': '2', 'Construct Number': '25', 'Direction': 'fw primer', 'Primer Sequence': 'TAACTATCACTATAGGGAGAgaggtactagatgacggtctgcgcaaaaaaacacgttcat'}
{'Part Number': '2', 'Construct Number': '25', 'Direction': 're primer', 'Primer Sequence': 'GGCCCCAAGGGGTTATGCTAttattatatcagatcctccagcatcaaacctgctgtcgct'}

私の目標は、両方に含まれる情報を組み合わせて、一番下のリストに各プライマー (fw または re) のパーツ番号、コンストラクト番号、方向、プライマー シーケンス、メモ、コンストラクト、およびソースを含む出力を取得することです。「プライマー名」と「プライマー配列」を一致させるには、「パーツ番号」、「コンストラクト番号」、「方向」がすべて同じであることを確認する必要があります。

これを確認するために次のコードを試しましたが、うまくいかないようです。

for row in primers_names_list: #recall that primers_names_list is a list of dictionaries
    if any({x['Part Number'], x['Construct Number'], x['Direction']} == {row['part number'], row['construct number'], row['direction']} for x in primers_without_names):
        primers_with_names.append({'part number':row['part number'], 'construct number':row['construct number'], 'notes':row['notes'], 'primer sequence':x['Primer Sequence']})

どうすればこれを達成できるかについて、誰かがヒントを提供できますか?

どうもありがとう!

4

2 に答える 2

3

2 つの問題:

  1. part numberプライマー名にあり、プライマー配列intには があります。比較するには、を( str(val)を使用して)に変換するか、または( int(val)を使用して) int に変換する必要があります。strTrueintstrstr

  2. KeyErrorループで使用しているキー名は、正しくないため、例外をスローしています(プライマー シーケンスには がConstruct Numberあり、プライマー名には があることに注意してくださいconstruct) 。

動作するコード サンプルを次に示します。

primers_names_list = [
{'part number': 1, 'notes': 'Fw Gibson primer on pEM113 to extract CmR resistance and pSC101 backbone and T7 promoter and term.', 'direction': 'fw primer', 'construct': '24', 'source': 'pEM113'},
{'part number': 1, 'notes': 'Re Gibson primer on pEM113 to extract CmR resistance and pSC101 backbone and T7 promoter and term.', 'direction': 're primer', 'construct': '24', 'source': 'pEM113'},
{'part number': 2, 'notes': 'Fw Gibson primer on BBa_K274100 to extract crtEBI operon', 'direction': 'fw primer', 'construct': '24', 'source': 'BBa_K274100'},
{'part number': 2, 'notes': 'Re Gibson primer on BBa_K274100 to extract crtEBI operon', 'direction': 're primer', 'construct': '24', 'source': 'BBa_K274100'},
{'part number': 1, 'notes': 'Fw Gibson primer on pEM114 to extract CmR resistance and pSC101 backbone and K1F promoter and term.', 'direction': 'fw primer', 'construct': '25', 'source': 'pEM114'},
{'part number': 1, 'notes': 'Re Gibson primer on pEM114 to extract CmR resistance and pSC101 backbone and K1F promoter and term.', 'direction': 're primer', 'construct': '25', 'source': 'pEM114'},
]

primers_without_names = [
{'Part Number': '1', 'Construct Number': '24', 'Direction': 're primer', 'Primer Sequence': 'agaccgtcatctagtacctcTCTCCCTATAGTGAGTCGTATTACTCTAGAAGCGGCCGCg'},
{'Part Number': '1', 'Construct Number': '24', 'Direction': 'fw primer', 'Primer Sequence': 'tggaggatctgatataataaTAGCATAACCCCTTGGGGCCTCTAAACGGGTCTTGAGGGG'},
{'Part Number': '2', 'Construct Number': '24', 'Direction': 'fw primer', 'Primer Sequence': 'TACGACTCACTATAGGGAGAgaggtactagatgacggtctgcgcaaaaaaacacgttcat'},
{'Part Number': '2', 'Construct Number': '24', 'Direction': 're primer', 'Primer Sequence': 'GGCCCCAAGGGGTTATGCTAttattatatcagatcctccagcatcaaacctgctgtcgct'},
{'Part Number': '1', 'Construct Number': '25', 'Direction': 're primer', 'Primer Sequence': 'agaccgtcatctagtacctcTCTCCCTATAGTGATAGTTATTACTCTAGAAGCGGCCGCg'},
{'Part Number': '1', 'Construct Number': '25', 'Direction': 'fw primer', 'Primer Sequence': 'tggaggatctgatataataaTAGCATAACCCCTTGGGGCCTCTAAACGGGTCTTGAGGGG'},
{'Part Number': '2', 'Construct Number': '25', 'Direction': 'fw primer', 'Primer Sequence': 'TAACTATCACTATAGGGAGAgaggtactagatgacggtctgcgcaaaaaaacacgttcat'},
{'Part Number': '2', 'Construct Number': '25', 'Direction': 're primer', 'Primer Sequence': 'GGCCCCAAGGGGTTATGCTAttattatatcagatcctccagcatcaaacctgctgtcgct'},
]


primers_with_names = []
for row in primers_names_list: #recall that primers_names_list is a list of dictionaries
    for x in primers_without_names:
        if (
            int(x['Part Number']) == row['part number'] and
            x['Construct Number'] == row['construct'] and
            x['Direction'] == row['direction']
        ):
            primers_with_names.append(
                {
                    'part number': row['part number'], 
                    'construct number': row['construct'], 
                    'notes': row['notes'], 
                    'primer sequence':x['Primer Sequence']
                }
            )
            # If you are only expecting one match from the primers_without_names
            # collection, or wish to enforce that, you can add a break statement after
            # the insertion here to break out of the inner comparison loop and move on
            # to the next row item


for p in primers_with_names:
    print p

print
print len(primers_with_names)

編集:比較値が各コレクションの各行で一意であり、十分なメモリがあり、リストの前処理を気にしない場合は、2 つのコレクションを辞書に変換し、(部品番号、構成番号、方向)タプル。これにより、後でルックアップの労力が削減され、行ごとに償却された O(1) になります。全体として、O(N^2) ではなく O(3N) が得られます。これは、大規模なセットにはかなり適しています。

# convert both lists to dictionaries
primers_names_dict = { 
    (str(p['part number']), str(p['construct']), str(p['direction'])): p
    for p in primers_names_list 
}
primers_sequence_dict = {
    (str(p['Part Number']), str(p['Construct Number']), str(p['Direction'])): p
    for p in primers_without_names
}


# now that we have two dicts, we can do a key<->key match between them, so each
# comparison op is just a dictionary key lookup, which is O(1) on average
matches = []
for key in primers_names_dict.keys():
    if key in primers_sequence_dict: # amortized O(1) lookup
        matches.append( {
            'part number': primers_names_dict[key]['part number'], 
            'construct number': primers_names_dict[key]['construct'], 
            'notes': primers_names_dict[key]['notes'], 
            'primer sequence': primers_sequence_dict[key]['Primer Sequence']
        } )

for m in matches:
    print m
print len(matches)
于 2013-01-23T20:24:28.973 に答える
1

ここには 2 つの問題があります。

  1. あるディクショナリの部品番号は整数で、別のディクショナリでは文字列です。

  2. あなたrow['construct number']は私がそうあるべきだと思う場所に置いたrow['construct']

ここで修正されます:

for row in primers_names_list: #recall that primers_names_list is a list of dictionaries
    for x in primers_without_names:
        if {x['Part Number'], x['Construct Number'], x['Direction']} == {str(row['part number']), row['construct'], row['direction']}:
            primers_with_names.append({'part number':row['part number'], 'construct number':row['construct'], 'notes':row['notes'], 'primer sequence':x['Primer Sequence']})
于 2013-01-23T20:25:30.003 に答える