how to make each key-value of a dictionary print on a new line?

Question:

If I have a given dictionary like this:

{'avglen': 4.419354838709677, 'count:': 93, 'mosts:': 'your', 'longs:': ['stretched'], 'shorts:': ['i', 'a'],}

how do I make each key-value print on a new line?

well its long but here is the code I’m using to get this dictionary. I pretty much added each key-value to the dictionary. So i figured out the shortest word and then I added that to the dictionary. I noticed it too that there are extra colons. but I figured its part of the values and I can use .replace() to take it away??

def build_report(freq):
    report={}
    freq_list=list(freq.keys())
    keys=sorted(freq, key=len)
    #for shorts:
    shortest=keys[0]
    shortest = [keys[0]]
    for key in keys[1:]:
        if len(key) == len(shortest[0]):
            shortest.append(key)
        else:
            break   
    report["shorts:"]=shortest
    #for longs:
    longest=keys[-1]
    longest = [keys[-1]]
    for key in reversed(keys[:-1]):
        if len(key) == len(longest[0]):
            longest.append(key)
        else:
            break
    report["longs:"]=longest
    #for mode:
    val_list=list(freq.values())
    sorted_val_list=sorted(val_list)
    mode=sorted_val_list[-1]
    for key in freq.keys():
        if freq[key]==mode:
            mode_word=key
    report["mosts:"]=mode_word
    # for word count:
    wordcount=len(list(freq.keys()))
    report["count:"]=wordcount
    #for average length:
    avg=list(freq.keys())
    average=sum(map(len,avg))/len(avg)
    report["avglen"]=average
    #for freq dictionary of word to word count
    freqs=freq
    report["freqs:"]=freqs
    return report
Asked By: user2976821

||

Answers:

Iterate over dict.items and print:

>>> d = {'avglen': 4.419354838709677, 'count:': 93, 'mosts:': 'your', 'longs:': ['stretched'], 'shorts:': ['i', 'a'],}
>>> for k, v in d.items():
...     print (k, '-->', v)
...     
mosts: --> your
count: --> 93
avglen --> 4.41935483871
shorts: --> ['i', 'a']
longs: --> ['stretched']

Or use the pprint module:

>>> import pprint
>>> pprint.pprint(d)
{'avglen': 4.419354838709677,
 'count:': 93,
 'longs:': ['stretched'],
 'mosts:': 'your',
 'shorts:': ['i', 'a']}
Answered By: Ashwini Chaudhary

You may be looking for pprint, the pretty printer standard library. For example:

import pprint
pprint.pprint({'avglen': 4.419354838709677, 
               'count:': 93,
               'mosts:': 'your',
               'longs:': ['stretched'],
               'shorts:': ['i', 'a'],})

outputs

{'avglen': 4.419354838709677,
 'count:': 93,
 'longs:': ['stretched'],
 'mosts:': 'your',
 'shorts:': ['i', 'a']}
Answered By: Nathan Davis

If you really don’t want to import pprint but want it to “look like” a dictionary, you could do:

print("{" + "n".join("{!r}: {!r},".format(k, v) for k, v in d.items()) + "}")
Answered By: jonrsharpe

In your past six questions or so, you seem to be using this poor dictionary as a text-indexed object of sorts. Why not make it a proper class?

from collections import Counter

textfreq = {
    'I': 1, 'heaven': 1, 'filled': 1, 'their': 1, 'termed': 1, 'of': 4,
    'And': 3, 'parts': 1, 'neer': 1, 'to': 2, 'song': 1, 'poets': 1,
    'The': 1, 'a': 2, 'were': 2, 'verse': 1, 'your': 6, 'knows': 1,
    'not': 1, 'half': 1, 'number': 1, 'but': 1, 'yours': 1, 'come': 2,
    'rage': 1, 'age': 2, 'Though': 1, 'men': 1, 'fresh': 1, 'heavenly': 1,
    'say': 1, 'alive': 1, 'truth': 1, 'this': 1, 'If': 2, 'than': 1,
    'old': 1, 'believe': 1, 'Which': 1, 'that': 1, 'You': 1, 'faces': 1,
    'yet': 1, 'poet': 1, 'in': 4, 'life': 1, 'most': 1, 'earthly': 1,
    'will': 1, 'hides': 1, 'my': 3, 'papers': 1, 'is': 1, 'stretched': 1,
    'rights': 1, 'eyes': 1, 'it': 3, 'yellowed': 1, 'Such': 1, 'So': 1,
    'all': 1, 'lies': 1, 'the': 1, 'an': 1, 'as': 1, 'write': 1,
    'child': 1, 'deserts': 1, 'shows': 1, 'tongue': 1, 'twice': 1,
    'Be': 1, 'high': 1, 'some': 1, 'could': 1, 'should': 2, 'and': 2,
    'touched': 1, 'like': 1, 'would': 1, 'Who': 1, 'tomb': 1, 'numbers': 1,
    'antique': 1, 'scorned': 1, 'metre': 1, 'time': 2, 'touches': 1,
    'be': 1, 'with': 2, 'true': 1, 'beauty': 1, 'rhyme': 1, 'less': 1,
    'But': 1, 'graces': 1, 'live': 1
}

class TextStats():
    def __init__(self, text=''):
        if hasattr(text, 'wordfreq'):
            # copy an existing TextStats object
            self.wordfreq = Counter(text.wordfreq)
        elif hasattr(text, 'keys'):
            # load from an existing dict or Counter
            self.wordfreq = Counter(text)
        else:
            # parse from a string
            # TO DO - strip all punctuation
            self.wordfreq = Counter(w for w in text.lower().split() if w)

    @classmethod
    def from_file(cls, fname):
        with open(fname) as inf:
            text = ' '.join(line.strip() for line in inf.readlines())
            return cls(text.translate(None, '`~!@#$'"'))

    def __add__(self, otherTextStats):
        return TextStats(self.wordfreq + otherTextStats.wordfreq)

    def __str__(self):
        return(
           "Count:        {}n"
           "Average len:  {:0.4f}n"
           "Shortest:     {}n"
           "Most common:  {}n"
           "Longest:      {}n".format(
               self.total_words,
               self.average_word_length,
               self.shortest_words,
               self.most_common_words,
               self.longest_words
           )
        )

    @property
    def unique_words(self):
        return len(self.wordfreq)

    @property
    def total_words(self):
        return sum(self.wordfreq.values())

    @property
    def total_letters(self):
        return sum(len(w)*c for w,c in self.wordfreq.items())

    @property
    def average_word_length(self):
        return float(self.total_letters) / self.total_words

    @property
    def shortest_words(self):
        minlen = len(min(self.wordfreq, key=len))
        return sorted(w for w in self.wordfreq if len(w)==minlen)

    @property
    def most_common_words(self):
        most_common = self.wordfreq.most_common()
        howmany = most_common[0][1] if most_common else 0
        return sorted(w for w,c in most_common if c == howmany)

    @property
    def longest_words(self):
        maxlen = len(max(self.wordfreq, key=len))
        return sorted(w for w in self.wordfreq if len(w)==maxlen)

def main():
    t = TextStats(textfreq)
    u = TextStats.from_file('corpus.txt')
    v = t + u

    print(t)
    print()
    print(u)
    print()
    print(v)

if __name__=="__main__":
    main()
Answered By: Hugh Bothwell

for those of you using pprint wondering why your dictionary still wont print each entry to a new line: could be that your dictionary entries or the whole dictionary are too short. in this case, invoke the PrettyPrinter class directly and set the width argument accordingly, as specified in the docs:

import pprint
stuff = {'avglen': 4.41, 'count:': 93, 'shorts:': ['i', 'a']}
pretty = pprint.PrettyPrinter(width=30)
pretty.pprint(stuff)
Answered By: mluerig

For a quick print you could use string replace to put newlines into the output. This method does not give beautiful results if the dictionary contains lists; those lists will also get newlines.

td = {'avglen': 4.419354838709677, 'count:': 93, 'mosts:': 'your', 'longs:': ['stretched'], 'shorts:': ['i', 'a'],}
print(str(td).replace(', ',',n '))

Outputs

{'avglen': 4.419354838709677,
 'count:': 93,
 'mosts:': 'your',
 'longs:': ['stretched'],
 'shorts:': ['i',
 'a']}
Answered By: MrBlank
resources = {
    "water": 300,
    "milk": 200,
    "coffee": 100, }


for key in resources:
    print (f"{key}: {resources[key]}")

outputs

water: 300
milk: 200
coffee: 100
Answered By: Davr

I found a new way to do it with json, very easy to use.

import json
dict1 = {'0': 0, '1': 70, '2': 37, '3': 11, '4': 6, '5': 5, '6': 3, '7': 1, '8': 0, '9': 0, '10': 0, '11': 0, '12': 0, '13': 0, '14': 0, '15': 0}
print(json.dumps(dict1, indent = 4))

The result should be like this:

{
    "0": 0,
    "1": 70,
    "2": 37,
    "3": 11,
    "4": 6,
    "5": 5,
    "6": 3,
    "7": 1,
    "8": 0,
    "9": 0,
    "10": 0,
    "11": 0,
    "12": 0,
    "13": 0,
    "14": 0,
    "15": 0
}

From the first answer in this thread:
How to print a dictionary line by line in Python?

Answered By: Tokki

Can do it this way without having to import any modules. Just iterate over the dictionary and print a new line after each key:value pair.

dict = {'1':1,'2':2,'3':3}
for key,value in dict.items():
    print(key,value,'n')
Answered By: Timothy Woodard
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.