I assume your complete data may look somehow like this:
[{'allow_day_and_time': {'day': 'Monday', 'start': 9, 'end': 18}},
{'allow_day_and_time': {'day': 'Tuesday', 'start': 9, 'end': 18}},
{'allow_day_and_time': {'day': 'Wednesday', 'start': 9, 'end': 18}},
{'allow_day_and_time': {'day': 'Thursday', 'start': 9, 'end': 18}},
{'allow_day_and_time': {'day': 'Friday', 'start': 9, 'end': 18}},
{'allow_day_and_time': {'day': 'Monday', 'start': 13, 'end': 21}},
{'allow_day_and_time': {'day': 'Tuesday', 'start': 13, 'end': 21}},
{'allow_day_and_time': {'day': 'Wednesday', 'start': 13, 'end': 21}},
{'allow_day_and_time': {'day': 'Thursday', 'start': 13, 'end': 21}},
{'allow_day_and_time': {'day': 'Friday', 'start': 13, 'end': 21}}]
Since your data is a list
of dictionary
items, you can access the dictionary
simply by supplying the key
within []
bracket, or, you can retrieve the key
and value
using dictionary.iteritems()
Iterating with dictionary.iteritems()
In [ ]: index = 0
...: while index < len(availability_constraints):
...: for key, value in availability_constraints[index].iteritems():
...: print(key, value)
...: index += 1
...:
('allow_day_and_time', {'start': 9, 'end': 18, 'day': 'Monday'})
('allow_day_and_time', {'start': 9, 'end': 18, 'day': 'Tuesday'})
('allow_day_and_time', {'start': 9, 'end': 18, 'day': 'Wednesday'})
('allow_day_and_time', {'start': 9, 'end': 18, 'day': 'Thursday'})
('allow_day_and_time', {'start': 9, 'end': 18, 'day': 'Friday'})
('allow_day_and_time', {'start': 13, 'end': 21, 'day': 'Monday'})
('allow_day_and_time', {'start': 13, 'end': 21, 'day': 'Tuesday'})
('allow_day_and_time', {'start': 13, 'end': 21, 'day': 'Wednesday'})
('allow_day_and_time', {'start': 13, 'end': 21, 'day': 'Thursday'})
('allow_day_and_time', {'start': 13, 'end': 21, 'day': 'Friday'})
Let's say you are querying the start of Monday
, you can use if
and ==
operator to check if the value
of that particular element of the list is referring to Monday
:
In [ ]: index = 0
...: while index < len(availability_constraints):
...: for key, value in availability_constraints[index].iteritems():
...: if value['day'] == 'Monday':
...: print("Start: {:>4}, Finish: {:>4}".format(value['start'], value['end']))
...: index += 1
...:
Start: 9, Finish: 18
Start: 13, Finish: 21
Iterating with []
and supplying hardcoded key
Another more straightforward/hardcoded, which may not be the best programming practice, is shown below:
In [ ]: for a_day in availability_constraints:
...: if a_day['allow_day_and_time']['day'] == 'Monday':
...: print("Start: {:>4}, Finish: {:>4}".format(
...: a_day['allow_day_and_time']['start'],
...: a_day['allow_day_and_time']['end']))
...:
...:
Start: 9, Finish: 18
Start: 13, Finish: 21
We can also introduce indirection for better maintenance:
In [ ]: key = 'allow_day_and_time'
...: target_day = 'Monday'
...: begin = 'start'
...: finish = 'end'
...: for a_day in availability_constraints:
...: if a_day[key]['day'] == target_day:
...: print("Start: {:>4}, Finish: {:>4}".format(
...: a_day[key][begin],
...: a_day[key][finish]))
...:
...:
Start: 9, Finish: 18
Start: 13, Finish: 21
Conclusion: The pythonic way
Check this link for pythonic string formatting
In [ ]: for a_day in availability_constraints:
...: for key, value in a_day.iteritems():
...: if value['day'] == 'Monday':
...: print("Start: {:>4}, Finish: {:>4}".format(value['start'], value['end']))
Start: 9, Finish: 18
Start: 13, Finish: 21
Which programming style is the best? Well, I'm pretty opinionated myself, so I believe it depends on your preference unless you want this program to be optimized :D