我希望编写一个数据结构来表示一些遗传数据。此数据可以表示为大小为 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__()
现在,我有两个问题。第一个是 self.r 的索引是 float ,这显然是个坏主意。我正在考虑将它们转换为字符串(具有固定位数),但是有更好的主意吗?我遇到的另一个问题是我想通过 gpos
实现访问条目,所以如果我想访问 gpos
0.2 和 0.4 之间的所有内容,我会喜欢能够使用
import numpy as np
Coords(np.arange(1,0,-.1))
c.r[0.2:0.4]
有没有简单的方法来定义它?我正在考虑使用二进制搜索找到开始和结束位置的正确 id
,然后使用这些 id 访问 self.f
,但是有没有办法实现上述语法?
最佳答案
当您使用切片索引对象时,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
字典中使用,我认为最简单的方法是创建一个 FancyIndexDict
是dict
的子类,修改它的__getitem__
方法,然后让self.r
成为一个 FancyIndexDict
,不是 dict
。
关于python - 自定义索引的数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18478024/