我想在类中找到对象的第二个属性,使第一个属性具有一定的值。
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
查找颜色。
问题的答案可能有两种形式:
谢谢。
编辑:在简化一点问题时,我失去了使用课程的动机。 &#34; Day&#34;对象实际上有15个属性和2个方法(不只是colour
)。所以@ cole 的建议很好,但不是很多属性。这些物品用于计算各种物品:300天中有多少是休息时间?半天有多少?也许我在使用复杂的列表/字典和移动到完整的ORM之间陷入困境?
答案 0 :(得分:2)
我认为您可以使用bisect
和OrderedDict
。
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']
替代解决方案:
答案 3 :(得分:0)
您确定不想要阵列吗?数据结构应该可以轻松处理几百个对象,但在这里使用数组更有意义。
我使用filter
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时间。