1

次のように Atom オブジェクトを作成しました。

class Atom(object):
    def __init__(self, symbol, x, y, z)
        self.symbol = symbol
        self.position = (x, y, z)

いくつかの基準によって選択されたアトムを含むSelectionクラス:

class Selection(object):
    def __init__(self, a_system, atom_list=[]):
        for atom in a_system:
            atom_list.append(atom)
        self.atom_list = atom_list

    def by_symbol(self, symbol):
        r_list = []
        for atom in self.atom_list:
            if atom.symbol is symbol:
                r_list.append(atom)
        self.atom_list = r_list

    def by_zrange(self, zmin, zmax):
        r_list = []
        for atom in self.atom_list:
            pos = atom.position[2]
            if pos > zmin and pos < zmax:
                r_list.append(atom)
        self.atom_list = r_list

ご覧のとおり、たとえば次のように言えます。

# my_system is a list of atoms objects
group = Selection(my_system)

そして次のように言います。

group.by_symbol('H')

groupそして、すべての水素原子を対象にします。次に、私がする場合:

group.by_zrange(1, 2)

groupそして、 z 座標が 1 から 2 の間のすべての水素原子をオブジェクトに含めます。

私は他の選択基準を持っていますが、一般的にそれらはすべて同じ構造を持っています。

r_list = []
for atom in self.atom_list:
    # Some criteria here
        r_list.append(atom)
self.atom_list = r_list

質問は次のとおりです。選択基準ごとに上記の構造を書くことを避けるためにできることはありますか?

私の目的を達成するためのより簡単な方法があることを知っていれば、それを聞いてうれしいです.

4

2 に答える 2