On Thu, 28 Apr 2016 06:27 pm, jf...@ms4.hinet.net wrote: > I have a dictionary like this: > >>>> dct ={1: 'D', 5: 'A', 2: 'B', 3: 'B', 4: 'E'} > > The following code works: > >>>> for k in dct: print(k, dct[k]) > ... > 1 D > 2 B > 3 B > 4 E > 5 A
When you iterate over the dictionary, you get a single object each time, the key. So you have: k = 1 k = 2 etc. (It is a coincidence that they are in numeric order. That won't happen for all dicts, in all versions of Python. Normally they are in arbitrary order.) > and this one too: > >>>> for k,v in dct.items(): print(k,v) > ... > 1 D > 2 B > 3 B > 4 E > 5 A When you iterate over the dictionary items, you get a *pair* of objects, namely the key and the value in a tuple. So each time through the loop, you have something like: k, v = (1, 'D') # a tuple with two items which is equivalent to: k = 1 # first item v = 'D' # second item > But...this one? > >>>> for k,v in dct: print(k,v) > ... > Traceback (most recent call last): > File "<stdin>", line 1, in <module> > TypeError: 'int' object is not iterable > > No idea what the error message means:-( Can anyone explain it? Thanks > ahead. Remember that iterating over the dictionary gives you the keys alone. In this case, the keys are *integers*, not strings or lists or tuples. So you are asking Python to do this: k, v = 1 which you remember is equivalent to this: k = ??? # first item of int 1 v = ??? # second item of int 1 What goes into the ??? on each line? You cannot split 1 into two items, because it is not an iterable sequence (not a string, not a list, not a tuple). What you are asking Python to do makes no sense, so it gives a TypeError. -- Steven -- https://mail.python.org/mailman/listinfo/python-list