-2

コマンドを実行__str__するたびに、を使用して辞書に保存されているデータを印刷するにはどうすればよいですか。print使ってます:

def __str__(self):
    for atom in self.pdb_atoms().keys():
        return '%s'%self.pdb_atoms()[atom]

インデックスに文字列と整数が含まれるPythonの辞書がある場合{ 'CA' 56: 'ATOM 727 HG2 57 -7.010000 11.418000 -23.532000'....}

しかし、これにより、リスト全体ではなく、単一のキーに対応するデータが得られます。これにより、1344行のリストから727行のみが出力されます。どこが間違っているのか、私にはわかりません。pdb_atoms辞書の名前です

4

4 に答える 4

1

returnループに入っているとはどういう意味だと思いますか? __str__文字列を返す必要があります。関数が期待どおりに機能した場合、アトムごとに 1 つの文字列が返されます。Python は、あなたに言わずにそれらを 1 つの文字列に結合する方法をどのように知っているのでしょうか? 文字列をくっつける方法はたくさんありますが、複数回返す関数を解釈する可能性が非常に高い方法ではありません (関数が数値を返すとどうなるでしょうか?)。

実際には、関数は 1 回しか返ることができません。これは、私が考えることができるほぼすべての言語の基本的な特性です (論理プログラミング言語を除く)。したがって、ループに入れた場合に起こることreturnは、関数がループの最初の反復で返されて完了することだけです。これがまさに、関数が最初のキーのみを表示する理由です!

return複数回使用できるものに少し似たものがあります: yield. 事実上、これにより、複数の値を反復子として返すことができます (これは、ループで1 回だけforループして、それらを再び取得できます)。しかし__str__、文字列を返す必要があり、複数の文字列を含むイテレータは文字列ではないため、ここでは役に立ちません!

于 2012-06-14T22:29:25.267 に答える
0

リスト全体を構築する前に関数呼び出しから戻っているため、問題が発生します。辞書全体を返すには、次のことを試してください。

def __str__(self):
    return ''.join([self.pdb_atoms()[atom] for atom in self.pdb_atoms().keys()])

また、文字列オブジェクトを直接使用する方法に注意してください。'%s'%(string)

編集: @Wooble がコメントで指摘したように、辞書オブジェクトを呼び出すことはできません。pdb_atoms の意味は、辞書を返すコマンドだと思います。そうでない場合は、 を削除してください()

于 2012-06-14T18:50:09.677 に答える
0

すべての値が改行で区切られた文字列が必要な場合は、次のようにしてみてください。

def __str__(self):
    return '\n'.join(self.pdb_atoms())
于 2012-06-14T19:02:25.633 に答える
0
def __str__(self):
    return '\n'.join(str(v) for v in self.pdb_atoms().itervalues())
于 2012-06-15T03:11:16.360 に答える