根据该对象的第二个属性

时间:2017-08-25 02:34:11

标签: 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' # or some other values depending on the details

对物体很陌生,我只是将它们保存在一个字典中。 {'1': <__main__.Day object at 0x7f9a444cacd0>, '2': <__main__.Day object at 0x7f9a447cacd0>, etc}

现在有一种简单的方法可以检索对应于一系列日期的colour吗?或者,更简单地说是一个日期?

我只能考虑做sorted(dict.iteritems())这样的事情,然后逐一检查day_object.date列表。如果是我想要的日期,请使用day_object.colour查找颜色。

问题的答案可能有两种形式:

  1. 存储/访问几百个对象(dict除外)的更好方法
  2. 一种查询字典中对象的方法,以获取我感兴趣的日子的颜色。
  3. 谢谢。

    编辑:在简化一点问题时,我失去了使用课程的动机。 &#34; Day&#34;对象实际上有15个属性和2个方法(不只是colour)。所以@ cole 的建议很好,但不是很多属性。这些物品用于计算各种物品:300天中有多少是休息时间?半天有多少?也许我在使用复杂的列表/字典和移动到完整的ORM之间陷入困境?

5 个答案:

答案 0 :(得分:2)

我认为您可以使用bisectOrderedDict

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)

答案 1 :(得分:1)

首先,列表是您想要做的更好的数据结构。除非键具有一些从问题中不明显的含义。

您可以使用列表理解(一旦所有内容都在列表中)执行您想要的操作。

foo = list()
for date in dates:
    some_day = Day(date)
    some_day.colour = 'Red'
    foo.append(some_day)

values = [x.colour for x in foo if date_1 <= x.date <= date_2]

答案 2 :(得分:1)

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

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']

重新:&#34;一种查询字典中对象的方法,以获取我感兴趣的日子的颜色。&#34; 如果你想使用当前的字典数据结构 - 我不推荐:):

[day for day in dict_of_days.values if day.colour='Red']

但是您注意到您的密钥在此表单中没有多大意义或用途,所以我建议将其存储在列表而不是字典中。进入列表后,您可以运行以下内容以获取红色的所有日期:

[day for day in list_of_days if day.colour='Red']

替代解决方案

  1. 将您的数据存储在 pandas dataframe 中。 http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.html。通过这种方式,您可以以表格格式对数据进行切片和切块(即columns = [Day,Color,IsHalfDay等])
  2. 对于快速轻量级ORM解决方案,尝试一对多(颜色到白天)或多对多(颜色到白天)关系http://docs.sqlalchemy.org/en/latest/orm/basic_relationships.html

答案 3 :(得分:0)

  1. 您确定不想要阵列吗?数据结构应该可以轻松处理几百个对象,但在这里使用数组更有意义。

  2. 我使用filter

  3. filter(lambda day: min_date < day.date < max_date, array_of_dates)

    请注意,假设您有一组日期。

    写完后我想到了这个想法:为什么不完全取消对象并且只有一个dict,键是一个日期时间对象而值是颜色?你仍然需要filter来获得一个范围(它应该比排序更快)。

答案 4 :(得分:0)

如果你想要的是dict,也许你不应该在这里使用课程。那是good video about this on youtube。使用dicts列表比使用类列表更容易。你甚至可以有一个dict,每个键都是日期,如果它们对每个键都是唯一的。

当你说你把它们保存在一个字典中时。你什么意思?你把每个类的副本作为一个dict,每个都有一个数字键?这是浪费内存和CPU时间。