Warm tip: This article is reproduced from stackoverflow.com, please click
python python-2.7 nested-lists

Alphabetize and then split on character in nested list

发布于 2020-03-27 10:29:29

I have some inherited code that works in other scenarios but is not working in this current application...

I have the following input:

import itertools

split_into_tables = [['abc=0', 'def=0', 'imsi=0', 'kekri=1234567890', 'sum=asdf', 'origin=d1', 'sID=FD330AD9-1FEB-4A33-BC0F-CF760AE203E9'], ['abc=0', 'def=0', 'imsi=0', 'kekri=NA', 'sum=asdf', 'origin=source', 'sID=FD330AD9-1FEB-4A33-BC0F-CF760AE203E9'], ['addkik=BasdferySaver', 'addpop=false', 'sum=asdf', 'origin=d1', 'sID=FD330AD9-1FEB-4A33-BC0F-CF760AE203E9', 'gjk=EDT'], ['addkik=device_id', 'addpop=F309387C-AAF5-478D-95A2-28E9B46105C7', 'sum=asdf', 'origin=d1', 'sID=FD330AD9-1FEB-4A33-BC0F-CF760AE203E9', 'gjk=EDT'], ['addkik=tmgfd', 'addpop=fixed_ap', 'sum=asdf', 'origin=d1', 'sID=FD330AD9-1FEB-4A33-BC0F-CF760AE203E9', 'gjk=EDT'], ['addkik=jej_unified', 'addpop=false', 'sum=asdf', 'origin=d1', 'sID=FD330AD9-1FEB-4A33-BC0F-CF760AE203E9', 'gjk=EDT'], ['addkik=internalversion', 'addpop=19.1.0.12', 'sum=asdf', 'origin=d1', 'sID=FD330AD9-1FEB-4A33-BC0F-CF760AE203E9', 'gjk=EDT'], ['addkik=version', 'addpop=3.11.0', 'sum=asdf', 'origin=d1', 'sID=FD330AD9-1FEB-4A33-BC0F-CF760AE203E9', 'gjk=EDT'], ['addkik=carrierid', 'addpop=AT&T', 'sum=asdf', 'origin=d1', 'sID=FD330AD9-1FEB-4A33-BC0F-CF760AE203E9', 'gjk=EDT'], ['addkik=activecarrierid', 'addpop=0', 'sum=asdf', 'origin=d1', 'sID=FD330AD9-1FEB-4A33-BC0F-CF760AE203E9', 'gjk=EDT'], ['addkik=UserConsent', 'addpop=yes', 'sum=asdf', 'origin=d1', 'sID=FD330AD9-1FEB-4A33-BC0F-CF760AE203E9', 'gjk=EDT'], ['addkik=idk', 'addpop=2019-07-02T14:28:48+0000', 'sum=asdf', 'origin=d1', 'sID=FD330AD9-1FEB-4A33-BC0F-CF760AE203E9', 'gjk=EDT'], ['addkik=ieir', 'addpop=sdfhs', 'sum=asdf', 'origin=d1', 'sID=FD330AD9-1FEB-4A33-BC0F-CF760AE203E9', 'gjk=EDT']]

The following code should alphabetize every nested list based on the first string before the '=', and then after doing so, split the strings into 2 (string before and the string after the '=').

e=0
while e < len(split_into_tables):
    if split_into_tables[e] == ['No result found=No result found']:
        e = e+1
    else:
        si = iter(split_into_tables[e])
        split_into_tables[e] = ['='.join(each) for each in itertools.izip(si, si)]
        e = e+1
e_ = 0
while e_ < len(split_into_tables):
    split_into_tables[e_] = sorted(split_into_tables[e_], key=str.lower)
    e_ = e_+1

split_into_tables_alpha = [sum([x.split('=') for x in sublist], []) for sublist in split_into_tables]

But this is the output I am getting:

split_into_tables_alpha = [['abc', '0', 'def', '0', 'imsi', '0', 'kekri', '1234567890', 'sum', 'asdf', 'origin', 'd1'], ['abc', '0', 'def', '0', 'imsi', '0', 'kekri', 'NA', 'origin', 'source', 'sID', 'FD330AD9-1FEB-4A33-BC0F-CF760AE203E9'], ['addkik', 'BasdferySaver', 'addpop', 'false', 'gjk', 'EDT', 'origin', 'd1', 'sID', 'FD330AD9-1FEB-4A33-BC0F-CF760AE203E9', 'sum', 'asdf'], ['addkik', 'device_id', 'addpop', 'F309387C-AAF5-478D-95A2-28E9B46105C7', 'gjk', 'EDT', 'origin', 'd1', 'sID', 'FD330AD9-1FEB-4A33-BC0F-CF760AE203E9', 'sum', 'asdf'], ['addkik', 'tmgfd', 'addpop', 'fixed_ap', 'gjk', 'EDT', 'origin', 'd1', 'sID', 'FD330AD9-1FEB-4A33-BC0F-CF760AE203E9', 'sum', 'asdf'], ['addkik', 'jej_unified', 'addpop', 'false', 'gjk', 'EDT', 'origin', 'd1', 'sID', 'FD330AD9-1FEB-4A33-BC0F-CF760AE203E9', 'sum', 'asdf'], ['addkik', 'internalversion', 'addpop', '19.1.0.12', 'gjk', 'EDT', 'origin', 'd1', 'sID', 'FD330AD9-1FEB-4A33-BC0F-CF760AE203E9', 'sum', 'asdf'], ['addkik', 'version', 'addpop', '3.11.0', 'gjk', 'EDT', 'origin', 'd1', 'sID', 'FD330AD9-1FEB-4A33-BC0F-CF760AE203E9', 'sum', 'asdf'], ['addkik', 'carrierid', 'addpop', 'AT&T', 'gjk', 'EDT', 'origin', 'd1', 'sID', 'FD330AD9-1FEB-4A33-BC0F-CF760AE203E9', 'sum', 'asdf'], ['addkik', 'activecarrierid', 'addpop', '0', 'gjk', 'EDT', 'origin', 'd1', 'sID', 'FD330AD9-1FEB-4A33-BC0F-CF760AE203E9', 'sum', 'asdf'], ['addkik', 'UserConsent', 'addpop', 'yes', 'gjk', 'EDT', 'origin', 'd1', 'sID', 'FD330AD9-1FEB-4A33-BC0F-CF760AE203E9', 'sum', 'asdf'], ['addkik', 'idk', 'addpop', '2019-07-02T14:28:48+0000', 'gjk', 'EDT', 'origin', 'd1', 'sID', 'FD330AD9-1FEB-4A33-BC0F-CF760AE203E9', 'sum', 'asdf'], ['addkik', 'ieir', 'addpop', 'sdfhs', 'gjk', 'EDT', 'origin', 'd1', 'sID', 'FD330AD9-1FEB-4A33-BC0F-CF760AE203E9', 'sum', 'asdf']]

And this output is missing some of the elements that were in the original list, but it always turns out to be the last element in the nested list (if a value is in fact dropped). For instance, in the first nested list, 'sID=FD330AD9-1FEB-4A33-BC0F-CF760AE203E9' should have been broken into 'sID' and 'FD330AD9-1FEB-4A33-BC0F-CF760AE203E9' (which alphabetically, would have occurred last in the output), but it was dropped altogether...

Any ideas?

Questioner
cjg123
Viewed
70
Deepstop 2019-07-04 00:24

This includes the values after the equals sign. Itertools.chain(..) flattens the list after making 2 element lists from the split function.

[list(itertools.chain(*sorted([inner.split("=") for inner in outer]))) for outer in split_into_tables]