4

いくつかの遺伝データを表すデータ構造を書きたいと思っています。このデータは size のリストとして表すことができn、各エントリには 0 から 1 の間の実数である「遺伝的位置」もあります。命名法を明確にするために、リスト内の位置idと遺伝的位置を と呼びますgpos。私がこれを実装した方法は、

class Coords(object):

    def __init__(self, *args, **kwargs):
        self.f = list(*args, **kwargs)
        self.r = dict()
        for i,e in enumerate(self.f):
            self.r[e] = i

    def __setitem__(self,x,y):
        self.f.__setitem__(x,y)
        self.r.__setitem__(y,x)

    def __getitem__(self,x):
        return self.f.__getitem__(x)

    def __len__(self):
        return self.f.__len__()

今、これには2つの問題があります。1 つ目は、self.r のインデックスが float であることです。これは明らかに悪い考えです。文字列(桁数固定)に変換しようと考えていたのですが、何か良い案はありませんか?私が抱えているもう1つの問題は、を介してエントリにアクセスすることを実装したいということですgpos。たとえば、gpos0.2から0.4までのすべてにアクセスしたい場合は、

import numpy as np
Coords(np.arange(1,0,-.1))
c.r[0.2:0.4]

それを定義する簡単な方法はありますか?id二分探索で正しい開始位置と終了位置を見つけてから、self.fこれらのIDを使用してアクセスしようと考えていましたが、上記の構文を実装する方法はありますか?

4

2 に答える 2

5

スライスを使用してオブジェクトにインデックスを付けると、Python は指定sliceした入力を使用してオブジェクトを作成します。たとえば、 を実行するc[0.2:0.4]と、 に渡される引数は にc.__getitem__なりますslice(0.2, 0.4)__getitem__したがって、メソッドに次のようなコードを含めることができます。

def __getitem__(self, x):
    if isinstance(x, slice):
        start = x.start
        stop = x.stop
        step = x.step
        # Do whatever you want to do to define your return
    ...

Coordsオブジェクトではなくディクショナリでこの派手なインデックスを使用したい場合は、 のサブクラスであるを作成し、そのメソッドを変更して、ではなく にするself.rのが最も簡単だと思います。FancyIndexDictdict__getitem__self.rFancyIndexDictdict

于 2013-08-28T02:51:26.540 に答える