Python Forum
format the output from a nested dictionary.
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
format the output from a nested dictionary.
#1
Hello everyone im trying to make my codes output to look like this output,
without any trailing or leading symbols. Any tips on how i can do that?

The expected output should look like this.

Output:
| 0 | root | /bin/bash | 1 | bin | /usr/bin/nologin | 2 | daemon | /usr/bin/nologin | 1000 | nsa | /bin/bash
currentuser ={'root':{'uid': 0,'username': 'root' ,'shell': '/bin/bash'},
        'daemon': {'uid': 1,'username': 'daemon' ,'shell': '/usr/sbin/nologin'},
        'bin': {'uid': 2,'username': 'bin', 'shell':'/usr/sbin/nologin'},
        'nsa': {'uid': 1000,'username': 'nsa', 'shell': '/bin/bash'}}

for key, value in currentuser.items():
print(f"\nKey: {key}")
print(f"Value: {value}")
Yoriz write May-03-2021, 01:22 AM:
Please post all code, output and errors (in their entirety) between their respective tags. Refer to BBCode help topic on how to post. Use the "Preview Post" button to make sure the code is presented as you expect before hitting the "Post Reply/Thread" button.
Reply
#2
currentuser ={'root':{'uid': 0,'username': 'root' ,'shell': '/bin/bash'},
'daemon': {'uid': 1,'username': 'daemon' ,'shell': '/usr/sbin/nologin'},
'bin': {'uid': 2,'username': 'bin', 'shell':'/usr/sbin/nologin'},
'nsa': {'uid': 1000,'username': 'nsa', 'shell': '/bin/bash'}}

for v in currentuser.values():
    print(f'|{v["uid"]}|{v["username"]}|{v["shell"]}')
Output:
|0|root|/bin/bash |1|daemon|/usr/sbin/nologin |2|bin|/usr/sbin/nologin |1000|nsa|/bin/bash
I welcome all feedback.
The only dumb question, is one that doesn't get asked.
My Github
How to post code using bbtags


Reply
#3
If you want formatting, I prefer using a formatting package. tabulate has worked well for me.

from tabulate import tabulate

currentuser ={'root':{'uid': 0,'username': 'root' ,'shell': '/bin/bash'},
        'daemon': {'uid': 1,'username': 'daemon' ,'shell': '/usr/sbin/nologin'},
        'bin': {'uid': 2,'username': 'bin', 'shell':'/usr/sbin/nologin'},
        'nsa': {'uid': 1000,'username': 'nsa', 'shell': '/bin/bash'}}


columns = list(next(iter(currentuser.values())).keys())
print(tabulate([x.values() for x in currentuser.values()], headers=columns, tablefmt="presto"))
Output:
uid | username | shell -------+------------+------------------- 0 | root | /bin/bash 1 | daemon | /usr/sbin/nologin 2 | bin | /usr/sbin/nologin 1000 | nsa | /bin/bash
ndc85430 likes this post
Reply
#4
(May-02-2021, 11:19 PM)menator01 Wrote:
currentuser ={'root':{'uid': 0,'username': 'root' ,'shell': '/bin/bash'},
'daemon': {'uid': 1,'username': 'daemon' ,'shell': '/usr/sbin/nologin'},
'bin': {'uid': 2,'username': 'bin', 'shell':'/usr/sbin/nologin'},
'nsa': {'uid': 1000,'username': 'nsa', 'shell': '/bin/bash'}}

for v in currentuser.values():
    print(f'|{v["uid"]}|{v["username"]}|{v["shell"]}')
Output:
|0|root|/bin/bash |1|daemon|/usr/sbin/nologin |2|bin|/usr/sbin/nologin |1000|nsa|/bin/bash

Thanks for the reply i appreciate it. It works fine,
but i want this symbol | in the columns to align with eachother.
Reply
#5
(May-03-2021, 01:54 AM)bowlofred Wrote: If you want formatting, I prefer using a formatting package. tabulate has worked well for me.

from tabulate import tabulate

currentuser ={'root':{'uid': 0,'username': 'root' ,'shell': '/bin/bash'},
        'daemon': {'uid': 1,'username': 'daemon' ,'shell': '/usr/sbin/nologin'},
        'bin': {'uid': 2,'username': 'bin', 'shell':'/usr/sbin/nologin'},
        'nsa': {'uid': 1000,'username': 'nsa', 'shell': '/bin/bash'}}


columns = list(next(iter(currentuser.values())).keys())
print(tabulate([x.values() for x in currentuser.values()], headers=columns, tablefmt="presto"))
Output:
uid | username | shell -------+------------+------------------- 0 | root | /bin/bash 1 | daemon | /usr/sbin/nologin 2 | bin | /usr/sbin/nologin 1000 | nsa | /bin/bash

Thanks for the reply appreciate it, but i want to do it without import,
and i want the output to look like i requested.
Reply
#6
If you don't want to import, then you'll have to code it up.

Use len(str) to find the length of each of the elements in each column. Then use format strings to print each of the elements from that column in the correct length.

formats = ["<20", 10, 5]
data = [15, "Hello", "/bin/sh"]

print("".join(f"| {d:{f}}" for d,f in zip(data,formats)))
Output:
| 15 | Hello | /bin/sh
Reply
#7
You can pass formatting with f-strings so little adjustment to menator01 code would deliver required result (numbers are aligned to right and text to left which is canonical way to display these datatypes in table style):

currentuser ={'root':{'uid': 0,'username': 'root' ,'shell': '/bin/bash'},
              'daemon': {'uid': 1,'username': 'daemon' ,'shell': '/usr/sbin/nologin'},
              'bin': {'uid': 2,'username': 'bin', 'shell':'/usr/sbin/nologin'},
              'nsa': {'uid': 1000,'username': 'nsa', 'shell': '/bin/bash'}}

for value in currentuser.values():
    print(f"{value['uid']:>8} {value['username']:<12} {value['shell']:<15}")
This will print:

Output:
0 root /bin/bash 1 daemon /usr/sbin/nologin 2 bin /usr/sbin/nologin 1000 nsa /bin/bash
I personally like this type of display better than separated with |. However, if you prefer that you can add these into f-string quite easily:

for value in currentuser.values():
    print(f"| {value['uid']:>8} | {value['username']:<12} | {value['shell']:<15}")
This will deliver:

Output:
| 0 | root | /bin/bash | 1 | daemon | /usr/sbin/nologin | 2 | bin | /usr/sbin/nologin | 1000 | nsa | /bin/bash
I'm not 'in'-sane. Indeed, I am so far 'out' of sane that you appear a tiny blip on the distant coast of sanity. Bucky Katt, Get Fuzzy

Da Bishop: There's a dead bishop on the landing. I don't know who keeps bringing them in here. ....but society is to blame.
Reply
#8
Another possibility
currentuser ={'root':{'uid': 0,'username': 'root' ,'shell': '/bin/bash'},
'daemon': {'uid': 1,'username': 'daemon' ,'shell': '/usr/sbin/nologin'},
'bin': {'uid': 2,'username': 'bin', 'shell':'/usr/sbin/nologin'},
'nsa': {'uid': 1000,'username': 'nsa', 'shell': '/bin/bash'}}

for v in currentuser.values():
    print(f'|{v["uid"]}{" ".rjust(10-len(str(v["uid"])))}|{v["username"]}{" ".rjust(10-len(v["username"]))}|{v["shell"]}')
Output:
|0 |root |/bin/bash |1 |daemon |/usr/sbin/nologin |2 |bin |/usr/sbin/nologin |1000 |nsa |/bin/bash
I welcome all feedback.
The only dumb question, is one that doesn't get asked.
My Github
How to post code using bbtags


Reply
#9
(May-03-2021, 07:50 AM)perfringo Wrote: You can pass formatting with f-strings so little adjustment to menator01 code would deliver required result (numbers are aligned to right and text to left which is canonical way to display these datatypes in table style):

currentuser ={'root':{'uid': 0,'username': 'root' ,'shell': '/bin/bash'},
              'daemon': {'uid': 1,'username': 'daemon' ,'shell': '/usr/sbin/nologin'},
              'bin': {'uid': 2,'username': 'bin', 'shell':'/usr/sbin/nologin'},
              'nsa': {'uid': 1000,'username': 'nsa', 'shell': '/bin/bash'}}

for value in currentuser.values():
    print(f"{value['uid']:>8} {value['username']:<12} {value['shell']:<15}")
This will print:

Output:
0 root /bin/bash 1 daemon /usr/sbin/nologin 2 bin /usr/sbin/nologin 1000 nsa /bin/bash
I personally like this type of display better than separated with |. However, if you prefer that you can add these into f-string quite easily:

for value in currentuser.values():
    print(f"| {value['uid']:>8} | {value['username']:<12} | {value['shell']:<15}")
This will deliver:

Output:
| 0 | root | /bin/bash | 1 | daemon | /usr/sbin/nologin | 2 | bin | /usr/sbin/nologin | 1000 | nsa | /bin/bash

Thank you this worked well!
Reply
#10
Thank you all for your replies, the output is as i wanted it to print out.
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  need to compare 2 values in a nested dictionary jss 2 855 Nov-30-2023, 03:17 PM
Last Post: Pedroski55
  Nested dictionary acting strange Pedroski55 2 2,084 May-13-2021, 10:37 PM
Last Post: Pedroski55
Lightbulb Python Nested Dictionary michaelserra 2 2,593 Apr-18-2021, 07:54 AM
Last Post: michaelserra
  Can I format decimal places by column with a dictionary? Mark17 2 2,553 Dec-28-2020, 10:13 PM
Last Post: Mark17
  JupyterLab Dictionary Content Output Format Ourkid123uk 0 1,305 Sep-04-2020, 02:18 PM
Last Post: Ourkid123uk
  Issue accessing data from Dictionary/List in the right format LuisSatch 2 2,205 Jul-25-2020, 06:12 AM
Last Post: LuisSatch
  nested dictionary rkpython 7 3,254 May-29-2020, 11:13 AM
Last Post: rkpython
  Nested Dictionary/List tonybrown3 5 3,143 May-08-2020, 01:27 AM
Last Post: tonybrown3
  Format SQL Query Output phillyfa 2 4,042 Apr-22-2020, 07:45 AM
Last Post: buran
  Save output into a Excel Sheet with Format Table skaailet 1 2,491 Apr-17-2020, 11:56 PM
Last Post: thirteendec

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020