简体   繁体   中英

Extract data from list of lists? [Python 3.8]

Say I have this listoflists :

for sub_list in listoflists:
print(sub_list)

Output:

[('id', '1'), ('id', '2'), ('id', '3'), ('id', '4'), ('id', '5'), ('id', '6'), ('id', '7')]
[('username', 'admin'), ('username', 'boss'), ('username', 'bubu'), ('username', 'david'), ('username', 'leet'), ('username', 'niki'), ('username', 'roman')]
[('password', '!QAZ@WSX#EDC'), ('password', '!QAZ@WSX#EDC123123'), ('password', '123123'), ('password', '123456Aa!'), ('password', '1337'), ('password', 'A123456a'), ('password', 'QAZWSXEDC!')]
[('role', 'admin'), ('role', 'admin'), ('role', 'nobody'), ('role', 'user'), ('role', 'user'), ('role', 'user'), ('role', 'user')]

How can I sort all the data out to eventually make a table with columns: id, username, password, role? Using prettytables or whatever is the best and most pythonic way.

You can use use pandas to create dataframe:

import pandas as pd

data = [
    [('id', '1'), ('id', '2'), ('id', '3'), ('id', '4'), ('id', '5'), ('id', '6'), ('id', '7')],
    [('username', 'admin'), ('username', 'boss'), ('username', 'bubu'), ('username', 'david'), ('username', 'leet'), ('username', 'niki'), ('username', 'roman')],
    [('password', '!QAZ@WSX#EDC'), ('password', '!QAZ@WSX#EDC123123'), ('password', '123123'), ('password', '123456Aa!'), ('password', '1337'), ('password', 'A123456a'), ('password', 'QAZWSXEDC!')],
    [('role', 'admin'), ('role', 'admin'), ('role', 'nobody'), ('role', 'user'), ('role', 'user'), ('role', 'user'), ('role', 'user')],
]

df = pd.DataFrame([dict(subl) for subl in zip(*data)])
print(df)

Prints:

  id username            password    role
0  1    admin        !QAZ@WSX#EDC   admin
1  2     boss  !QAZ@WSX#EDC123123   admin
2  3     bubu              123123  nobody
3  4    david           123456Aa!    user
4  5     leet                1337    user
5  6     niki            A123456a    user
6  7    roman          QAZWSXEDC!    user

Or: Just use plain Python:

print('{:<10} {:<20} {:<20} {}'.format('id', 'username', 'password', 'role'))

for d in zip(*data):
    print('{:<10} {:<20} {:<20} {}'.format(*[v for _, v in d]))

Prints:

id         username             password             role
1          admin                !QAZ@WSX#EDC         admin
2          boss                 !QAZ@WSX#EDC123123   admin
3          bubu                 123123               nobody
4          david                123456Aa!            user
5          leet                 1337                 user
6          niki                 A123456a             user
7          roman                QAZWSXEDC!           user
import pandas as pd

all_lists = [
  [('id', '1'), ('id', '2'), ('id', '3'), ('id', '4'), ('id', '5'), ('id', '6'), ('id', '7')], 
  [('username', 'admin'), ('username', 'boss'), ('username', 'bubu'), ('username', 'david'), ('username', 'leet'), ('username', 'niki'), ('username', 'roman')],
  [('password', '!QAZ@WSX#EDC'), ('password', '!QAZ@WSX#EDC123123'), ('password', '123123'), ('password', '123456Aa!'), ('password', '1337'), ('password', 'A123456a'), ('password', 'QAZWSXEDC!')],
  [('role', 'admin'), ('role', 'admin'), ('role', 'nobody'), ('role', 'user'), ('role', 'user'), ('role', 'user'), ('role', 'user')]
]

cols = [l[0][0] for l in all_lists]
data = [[tup[1] for tup in l] for l in all_lists]
df = pd.DataFrame(columns=cols, data=zip(*data))
print(df)
  id username            password    role
0  1    admin        !QAZ@WSX#EDC   admin
1  2     boss  !QAZ@WSX#EDC123123   admin
2  3     bubu              123123  nobody
3  4    david           123456Aa!    user
4  5     leet                1337    user
5  6     niki            A123456a    user
6  7    roman          QAZWSXEDC!    user

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM