Printing a table of letter frequencies using Python
The printing portion should be simplified:


The use of OrderedDict is superfluous.  A list of pairs would suffice.
I'd prefer to stick to the same iteration variable, when it is used to refer to the same thing.  Choose either c or l.
You are not using str.format() effectively.
(total if total &gt; 0 else 1) could just be (total or 1).




for c, n in sorted(frequency.items()):
    print('{}:{:&gt;8}{:9.2f}%'.format(c, n, 100 * n / (total or 1)))


As for the counting process itself, you could write c in frequency instead of c in frequency.keys().  But, really, the task is so naturally suited to a collections.Counter that it would be silly not to use it.



from collections import Counter as _Counter
from string import ascii_lowercase as _ascii_lowercase

text = 'StackExchange Code Review'
frequency = _Counter({c: 0 for c in _ascii_lowercase})
frequency.update(c for c in text.lower() if c in frequency)

total = sum(frequency.values())
print('\n'.join(
    '{}:{:&gt;8}{:9.2f}%'.format(c, n, 100 * n / (total or 1))
    for c, n in sorted(frequency.items())
))


I think that the call to sorted() should be optional as of Python 3.6.