根据python对象的第二个属性访问该对象的属性

根据python对象的第二个属性访问该对象的属性,python,class,oop,dictionary,attributes,Python,Class,Oop,Dictionary,Attributes,我希望在类中找到对象的第二个属性,使第一个属性具有特定值 Class Day(object): def __init__(self, a_datetime_date): self.date = a_datetime_date self.colour = None 现在,我在一个循环中实例化了大量对象: for x in a_list_of_dates: some_day = Day(x) some_day.colour = 'Red' #

我希望在类中找到对象的第二个属性,使第一个属性具有特定值

Class Day(object):
    def __init__(self, a_datetime_date):
        self.date = a_datetime_date
        self.colour = None
现在,我在一个循环中实例化了大量对象:

for x in a_list_of_dates:
    some_day = Day(x)
    some_day.colour = 'Red' # or some other values depending on the details
由于对对象非常陌生,我只是将它们保存在一个dict中。
{'1':,'2':,等等}

现在有没有一种简单的方法来检索与日期范围相对应的
颜色
?或者,更简单地说,是一次约会

我只能想做一些类似于排序(dict.iteritems())的事情,然后逐个检查列表检查
day\u object.date
。如果是我想要的日期,那么使用
day\u object.color
查找有关颜色的信息

这个问题的答案有两种形式:

  • 存储/访问数百个对象(dict除外)的更好方法
  • 一种查询dict中的对象以获得我感兴趣的日子的颜色的方法
  • 多谢各位

    编辑:在简化问题的过程中,我使用类的动机消失了。“Day”对象实际上有15个属性和2个方法(不仅仅是
    颜色
    )。所以@cole的建议是好的,但不适合这么多属性。这些对象用于计算各种事情:300天中有多少是休息?半天有多少天?也许我在使用复杂的列表/目录和移动到完整的ORM之间左右为难

  • 您确定不需要数组吗?这两种数据结构都可以轻松处理几百个对象,但在这里使用数组对我来说更有意义

  • 我会使用
    过滤器

  • 过滤器(lambda-day:min\u-date

    请注意,这是假设您有一个日期数组


    在写了这篇文章之后,我想到了一个想法:为什么不完全删除对象,只使用一个dict,其中键是datetime对象,值是颜色?不过,您仍然需要
    筛选
    以获得范围(至少应该比排序快)

  • 您确定不需要数组吗?这两种数据结构都可以轻松处理几百个对象,但在这里使用数组对我来说更有意义

  • 我会使用
    过滤器

  • 过滤器(lambda-day:min\u-date

    请注意,这是假设您有一个日期数组



    在写了这篇文章之后,我想到了一个想法:为什么不完全删除对象,只使用一个dict,其中键是datetime对象,值是颜色?不过,您仍然需要
    筛选
    以获得一个范围(至少应该比排序快)。

    如果您想要的是一个dict,那么您不应该在这里使用类。这里有一个。与类列表相比,使用dict列表要容易得多。你甚至可以有一个dict,每个键都是日期,如果每个键都是唯一的


    当你说你“用口述保存了他们”时,你是什么意思?你把每个类都复制成一个dict,每个类都有一个数字键?这是对内存和CPU时间的浪费。

    如果您想要的是一个dict,那么可能不应该在这里使用类。这里有一个。与类列表相比,使用dict列表要容易得多。你甚至可以有一个dict,每个键都是日期,如果每个键都是唯一的


    当你说你“用口述保存了他们”时,你是什么意思?你把每个类都复制成一个dict,每个类都有一个数字键?这是对内存和CPU时间的浪费。

    首先,列表是一种更好的数据结构,可以满足您的需要。除非这些键有一些从问题中看不出的含义

    你可以通过列表理解来做你想做的事情(一旦所有事情都在列表中)

    foo=list()
    对于日期中的日期:
    某天=天(日期)
    某一天。颜色=‘红色’
    foo.append(某天)
    
    values=[x.color for x in foo if date_1首先,列表是一个更好的数据结构,可以满足您的需要。除非键有一些从问题中看不明显的含义

    你可以通过列表理解来做你想做的事情(一旦所有事情都在列表中)

    foo=list()
    对于日期中的日期:
    某天=天(日期)
    某一天。颜色=‘红色’
    foo.append(某天)
    
    values=[x.foo中x的颜色,如果date_1我认为您可以使用
    对分
    orderedict

    import bisect
    from collections import OrderedDict
    
    def foo(date):
        day = Day(date)
        day.colour = 'Red' # or some other values depending on the details
        return day
    
    container = OrderDict({date: foo(date) for date in sorted(date_list)})
    
    keys = list(container.keys())
    
    # find by range of dates
    
    start_index = bisect.bisect_left(keys, start_date)
    end_index = bisect.bisect(keys, end_date)
    
    for index in range(start_index, end_index);
        print(container[keys[index]].colour)
    
    # find by a single date
    
    print(container[single_date].colour)
    

    我认为您可以使用
    对分
    有序数据交换

    import bisect
    from collections import OrderedDict
    
    def foo(date):
        day = Day(date)
        day.colour = 'Red' # or some other values depending on the details
        return day
    
    container = OrderDict({date: foo(date) for date in sorted(date_list)})
    
    keys = list(container.keys())
    
    # find by range of dates
    
    start_index = bisect.bisect_left(keys, start_date)
    end_index = bisect.bisect(keys, end_date)
    
    for index in range(start_index, end_index);
        print(container[keys[index]].colour)
    
    # find by a single date
    
    print(container[single_date].colour)
    

    除了查找颜色外,我不确定您还打算做什么。请尝试使用颜色哈希字典;这将保持颜色和日期之间的关系:

    from collections import defaultdict
    color_dict = defaultdict(list)
    
    for x in a_list_of_dates:
        some_day = Day(x)
        some_day.colour = 'Red' # Not sure how you're planning to make these assignments.
        colour_dict['Red'].append(some_day)
    
    # Look up all Day objects colored Red
    colour_dict['Red']
    
    在re中:“一种查询dict中对象的方法,以获得我感兴趣的日子的颜色。” 如果您想使用当前的字典数据结构,我不推荐:):

    但您会注意到,您的密钥在此表单中没有太多意义或实用性,因此我建议将其存储在列表中,而不是存储在dict中。一旦存储在列表中,您可以运行以下命令以获取所有红色的日期:

    [day for day in list_of_days if day.colour='Red']
    
    替代解决方案

  • 将数据存储在数据框中。通过这种方式,您可以以表格格式(即列=[日期、颜色、IsHalfDay等])对数据进行切片和切分
  • 对于快速的轻量级ORM解决方案,请尝试一对多(颜色对日)或多对多(颜色对日)关系

  • 除了查找颜色外,我不确定您还打算做什么。请尝试使用颜色哈希字典;这将保持颜色和日期之间的关系:

    from collections import defaultdict
    color_dict = defaultdict(list)
    
    for x in a_list_of_dates:
        some_day = Day(x)
        some_day.colour = 'Red' # Not sure how you're planning to make these assignments.
        colour_dict['Red'].append(some_day)
    
    # Look up all Day objects colored Red
    colour_dict['Red']
    
    在re中:“一种查询dict中对象的方法,以获得我感兴趣的日子的颜色。” 如果您想使用当前的字典数据结构,我不会这么做