Skip to content
Advertisement

How to iterate dict in string.format

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.

User contributions licensed under: CC BY-SA
4 People found this is helpful
Advertisement