32

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
user2976821
  • 353
  • 1
  • 3
  • 8
  • Note that there seem to be leftover colons floating around in your keys. I'd have a look at whatever you're doing to generate that dictionary. – DSM Nov 24 '13 at 22:30
  • @DSM I added my code that generates the dictionary – user2976821 Nov 24 '13 at 22:53

9 Answers9

40

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()) + "}")
jonrsharpe
  • 115,751
  • 26
  • 228
  • 437
  • Slight addition: Placement of comma based separator must be performing the role of joiner. `print("{" + ",\n".join("{!r}: {!r}".format(k, v) for k, v in d.items()) + "}")` – Shubham Singh Oct 16 '21 at 17:24
  • @ShubhamSingh I wouldn't say it _must_ be - the trailing comma is valid in Python (and e.g. JavaScript, although not in the similar JSON). – jonrsharpe Oct 17 '21 at 11:20
27

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']}
Nathan Davis
  • 5,636
  • 27
  • 39
10

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']}
Ashwini Chaudhary
  • 244,495
  • 58
  • 464
  • 504
10

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)
mluerig
  • 638
  • 10
  • 25
5

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?

Andy K
  • 4,944
  • 10
  • 53
  • 82
Tokki
  • 51
  • 1
  • 2
3

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']}
MrBlank
  • 41
  • 2
1

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()
Hugh Bothwell
  • 55,315
  • 8
  • 84
  • 99
0
resources = {
    "water": 300,
    "milk": 200,
    "coffee": 100, }


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

outputs

water: 300
milk: 200
coffee: 100
Davr
  • 1
  • 2
0

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')