I want to move from the "i=0 ... i=i+1" construct to use Python enumerate. I'm having trouble with a list of datetime values. I understand that datetime objects (themselves) are not iterable (if that's the correct word) but I would think that a normal "list" of these objects would be iterable/enumerable. I must be wrong but I don't know why.
My original code:
import datetime
BIASList = [1.3719, 0.9861, 0.0782, 1.9248, 0.7429]
dList = [datetime.date(2017, 1, 19),
datetime.date(2017, 1, 20),
datetime.date(2017, 1, 21),
datetime.date(2017, 1, 22),
datetime.date(2017, 1, 23)]
i = 0
for d in dList:
dom = d.strftime("%d")
print(d, ' i = ', i, 'BIAS = ',
BIASList[i], 'dom = ', dom)
i = i + 1
produced
2017-01-19 i = 0 BIAS = 1.3719 dom = 19
2017-01-20 i = 1 BIAS = 0.9861 dom = 20
2017-01-21 i = 2 BIAS = 0.0782 dom = 21
2017-01-22 i = 3 BIAS = 1.9248 dom = 22
2017-01-23 i = 4 BIAS = 0.7429 dom = 23
My revised attempt at using enumerate was
import datetime
BIASList = [1.3719, 0.9861, 0.0782, 1.9248, 0.7429]
dList = [datetime.date(2017, 1, 19),
datetime.date(2017, 1, 20),
datetime.date(2017, 1, 21),
datetime.date(2017, 1, 22),
datetime.date(2017, 1, 23)]
i = 0
for count, d in dList:
dom = d.strftime("%d")
print(d, ' i = ', i, 'count = ', count, 'BIAS = ',
BIASList[count], 'dom = ', dom)
i = i + 1
The error was listed as
File ...\untitled0.py:21 in <module>
for count, d in dList:
TypeError: cannot unpack non-iterable datetime.date object
You need to call enumerate
with dList
as the argument. enumerate
will give you an iterable of tuples (the index and the original item), which you can use to produce the same i
as in your original code without needing to actually initialize and increment i
:
for i, d in enumerate(dList):
dom = d.strftime("%d")
print(d, ' i = ', i, 'BIAS = ',
BIASList[i], 'dom = ', dom)
If you're just trying to iterate over two lists in parallel, an even easier option is zip
:
for d, b in zip(dList, BIASList):
dom = d.strftime("%d")
print(f"{d} BIAS = {b} dom = {dom}")
and if you want to print that i
for some other reason you can combine enumerate
and zip
:
for i, (d, b) in enumerate(zip(dList, BIASList)):
dom = d.strftime("%d")
print(f"{d} i = {i} BIAS = {b} dom = {dom}")