1

以前に遭遇した問題を解決してくれた SO コミュニティに感謝します。ここでのヘルプが大好きです!

私は今、さらに別の問題を抱えています。「コンストラクト番号」と「パーツ番号」に関連付けられた DNA 配列のフラット リストがあります。現状では、前のコードから、それを開いて読み込み、インポートする csv ファイルとして持っています。ディクショナリ オブジェクトのリストです。すべてが既に "構成番号" で並べ替えられていますが、次に "部品番号" で並べ替える必要があります (Excel のようなもので、"最初の並べ替え基準" と表示されます)。次に並べ替え_ ."

これを行う方法を知っている人はいますか?これまでのところ、私が書いたのはこれだけです:

primers_list = open('primers-list.csv', 'rU')
primers_unsorted = csv.DictReader(primers_list)
for row in primers_unsorted:
    print(row)

これまでの出力のサブセットは、私が扱っているデータを視覚化するために、次のとおりです。

{' Direction': 'fw primer', ' Construct Number': '1', ' Part Number': '2', 'Primer Sequence': 'AAGCGGCCGCTCGAGTCTAAgctcactcaaaggcggtaatcagataaaaaaaatccttag'}
{' Direction': 're primer', ' Construct Number': '1', ' Part Number': '1', 'Primer Sequence': 'attaccgcctttgagtgagcTTAGACTCGAGCGGCCGCTTTTTGACACCAGACCAACTGG'}
{' Direction': 'fw primer', ' Construct Number': '1', ' Part Number': '1', 'Primer Sequence': 'TTTAATTACTAACTTTATCTATGATAGATCCCGTCGTTTTACAACGTCGTGACTGGGAAA'}
{' Direction': 're primer', ' Construct Number': '1', ' Part Number': '2', 'Primer Sequence': 'AAAACGACGGGATCTATCATAGATAAAGTTAGTAATTAAACTTAAAAGTTGTTTAATGTC'}
{' Direction': 'fw primer', ' Construct Number': '2', ' Part Number': '2', 'Primer Sequence': 'gtaaatccaagttgtaataatactagagTAGCATAACCCCTTGGGGCCTCTAAACGGGTC'}
{' Direction': 're primer', ' Construct Number': '2', ' Part Number': '1', 'Primer Sequence': 'GGGGTTATGCTActctagtattattacaacttggatttaccacctttcttcgccttgatc'}
{' Direction': 'fw primer', ' Construct Number': '2', ' Part Number': '1', 'Primer Sequence': 'TACGACTCACTATAGGGAGAtactagagttaaggaggtaaaaaaaatgggtccggtcgtt'}
{' Direction': 're primer', ' Construct Number': '2', ' Part Number': '2', 'Primer Sequence': 'ttacctccttaactctagtaTCTCCCTATAGTGAGTCGTATTACTCTAGAAGCGGCCGCg'}
{' Direction': 'fw primer', ' Construct Number': '3', ' Part Number': '2', 'Primer Sequence': 'gtaaatccaagttgtaataatactagagTAGCATAACCCCTTGGGGCCTCTAAACGGGTC'}
{' Direction': 're primer', ' Construct Number': '3', ' Part Number': '1', 'Primer Sequence': 'GGGGTTATGCTActctagtattattacaacttggatttaccacctttcttcgccttgatc'}
{' Direction': 'fw primer', ' Construct Number': '3', ' Part Number': '1', 'Primer Sequence': 'TAACTATCACTATAGGGAGAtactagagttaaggaggtaaaaaaaatgggtccggtcgtt'}
{' Direction': 're primer', ' Construct Number': '3', ' Part Number': '2', 'Primer Sequence': 'ttacctccttaactctagtaTCTCCCTATAGTGATAGTTATTACTCTAGAAGCGGCCGCg'}
4

3 に答える 3

5

別の方法:

import operator
primers_unsorted.sort(key=operator.itemgetter(' Construct Number', ' Part Number'))

for row in primers_unsorted:
    print(row)
于 2013-01-19T17:16:00.693 に答える
1

ブロックごとに実行したい場合は、次のようにすることができます。

a=0
while a<len(primers_list):
    b=a
    current_construct=primers_list['Construct Number']
    while primers_list[b]['Construct Number']==current_construct:
         b=b+1
    primers_list[a:b]=sorted( primers_list[a:b] , key = lambda e: (e[' Construct Number'],e[' Part Number']))
    a=b

これは、リストが非常に長い場合に役立ちます。

于 2013-01-19T17:23:33.800 に答える
1

私の最終的なコードはこれで、完全にうまくいきました:

primers_list = open('primers-list.csv', 'rU')
primers_unsorted = csv.DictReader(primers_list)
primers_sorted = sorted(primers_unsorted, key=operator.itemgetter('Construct Number', 'Part Number'))
for row in primers_sorted:
    print(row)

これの鍵 (しゃれを許してください) は、必要な数の引数を受け入れる operator.itemgetter(...) を使用することでした。sorted(...) の 'key' 引数に渡されます。

私の質問に答えてくれたエリックに感謝します!

于 2013-01-21T16:46:51.137 に答える