提供list
和dict
的课堂行为是一种好习惯吗?
这允许用户通过instance[str]
和instance[int]
访问项目。
例如:
class Population(object):
def __init__(self, populationlist):
self.population = populationlist
def __getitem__(self, value):
if isinstance(value, str):
index = self.get_names().index(value)
return self.population[ index ]
elif isinstance(value, int:
return self.population[value]
def get_names(self):
return [ ind.name for ind in self.population ]
class Individual(object):
def __init__(self, name):
self.name=name
my_pop = Population( [ Individual(name) for name in [ 'a', 'b', 'c', 'd' ] ] )
my_pop['c']
>> 'c'
my_pop[2]
>> 'c'
答案 0 :(得分:0)
显然,您可以创建一个类来处理所有这些但 未获得优化。你应该做的是使用Python的OrderedDict
来获得一个有效订单的字典。
答案 1 :(得分:0)
你问它是否良好做法,答案是明确的:否。
Python模块this
中提到了一些好的做法:
>>> import this
这里有四行有点适用:
Explicit is better than implicit.
:
您隐式将字符串索引转换为数字索引!
Special cases aren't special enough to break the rules.
输入字符串索引时,这显然是一种特殊情况。是什么让它与众不同?
In the face of ambiguity, refuse the temptation to guess.
这几乎就像特殊情况一样。您猜测没有人会输入等效的第二项(返回第一项或第二项或最后一项?)并且没有人会使用整数作为名称。
There should be one-- and preferably only one --obvious way to do it.
我认为这个是非常主观的,但我将其解释为"一个函数应该具有一个目的,没有其他功能可以实现"。您的__getitem__
有两个目的。拥有方法"find_by_name"
和方法"find_by_index"
不会有问题。
然而,还包括一些建设性的反馈:它几乎看起来像你想要一个表格结构。如果是这样,您应该考虑pandas或某个数据库,可能是sqllite
?
只是为了说明pandas
如何解决这个问题:
>>> import pandas as pd
>>> df = pd.DataFrame({'name': ['a', 'b', 'c', 'd']})
>>> print(df)
name
0 a
1 b
2 c
3 d
>>> print(df[df['name'] == 'a']) # index by name
name
0 a
>>> print(df.iloc[[0]]) # index by index
name
0 a