I read a lot of tutorials, but can not find how to iterate dict in string.format like this:
dict = {'this':'I','is':'am','title':'done'} print(f'the key is {k for k,v in dict}') print(f'the val is {v for k,v in dict}')
which I want a result like this:
the key is this is title the val is I am done
so I can print variable length dict.
dict = {'this':'I','is':'am','title':'done'} print(f'the key is {k for k,v in dict}') print(f'the val is {v for k,v in dict}')
Then I got error.
Advertisement
Answer
Currently your output is:
the key is <generator object <genexpr> at 0x7fbaca5443c0> the val is <generator object <genexpr> at 0x7fbaca5443c0>
That’s because k for k,v in dict
is a generator expression. Don’t confuse it with set comprehension, those curly braces are for f-string.
But of course that k for k,v in dict
is problematic. When you iterate over a dictionary itself, it gives you keys. So for the first iteration "this"
comes back. you can’t unpack "this"
into two variables. k, v = "this"
.
You can use this:
d = {"this": "I", "is": "am", "title": "done"} print(f'the key is {" ".join(d.keys())}') print(f'the val is {" ".join(d.values())}')
output:
the key is this is title the val is I am done
This join
works because keys and values are strings in your dictionary. If they are not, you should convert them like:
print(f'the key is {" ".join(map(str, d.values()))}')
For the first one you could also use print(f'the key is {" ".join(d)}')
as dictionaries will give keys in the iteration by default.