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:
> 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. for k, v in items: ... is basically a shortcut for for x in items: k, v = x The assignment with multiple names on the left side triggers what is called "unpacking", i. e. k, v = x is basically a shortcut for it = iter(x) try: k = next(it) v = next(it) except StopIteration: raise ValueError # not enough items try: next(it) # too many item if this succeeds except StopIteration: pass else raise ValueError Now remember that in for x in dct: ... x is actually the key and only the key -- an int in your example dict. Then iter(x) raises the exception you saw: >>> iter(42) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'int' object is not iterable If x were (for example) a string this would succeed it = iter("some string") as you can iterate over the string's characters -- but you'd get a ValueError for string lengths != 2: >>> k, v = "" Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: need more than 0 values to unpack >>> k, v = "ab" >>> k 'a' >>> v 'b' >>> k, v = "abc" Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: too many values to unpack (expected 2) With that information, can you predict what for k, v in {(1, 2): "three"}: print(k, v) will print? -- https://mail.python.org/mailman/listinfo/python-list