索引类作为列表和字典

时间:2017-02-15 09:25:54

标签: python list dictionary

提供listdict的课堂行为是一种好习惯吗? 这允许用户通过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'

2 个答案:

答案 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"不会有问题。

然而,还包括一些建设性的反馈:它几乎看起来像你想要一个表格结构。如果是这样,您应该考虑或某个数据库,可能是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