Combing 2D list of tuples and then sorting them in Python

前端 未结 3 479
星月不相逢
星月不相逢 2021-01-18 04:56

Update: The list are filled with strings I edited the list to show this

I have 3 different list such as

Section = [(\'1\', \'1.1\', \'1.2\'), (\'1\',         


        
相关标签:
3条回答
  • 2021-01-18 05:34

    My approach. List comprehension and no need to import modules. I think its fast, and its very simple.

    EDIT: I've added an unsorted approach and a sorted approach.

    #Unsorted
    newList =[
        [item for sublist in Section for item in sublist],
        [item for sublist in Page for item in sublist],
        [item for sublist in Titles for item in sublist]
        ]
    
    print newList
    #Output
    #[[1, 1.1, 1.2, 1, 2, 2.2, 3, 1, 1.2, 3.2, 3.5], 
    # [1, 1, 3, 1, 2, 2, 2, 1, 2, 3, 5], 
    # ['General', 'Info', 'Titles', 'More', 'Info', 'Section', 'Here', 'Another', 'List', 'Of', 'Strings']]
    
    #Sort first two lists afterwards, if desired
    for i in range(2):
        newList[i].sort()
    
    print newList
    #Output
    #[[1, 1, 1, 1.1, 1.2, 1.2, 2, 2.2, 3, 3.2, 3.5], 
    # [1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 5], 
    # ['General', 'Info', 'Titles', 'More', 'Info', 'Section', 'Here', 'Another', 'List', 'Of', 'Strings']]
    
    0 讨论(0)
  • 2021-01-18 05:41

    Try this,

    Section = [('1', '1.1', '1.2'), ('1', '2', '2.2', '3'), ('1', '1.2', '3.2', '3.5')] 
    Page = [('1', '1', '3'), ('1', '2', '2', '2'), ('1', '2', '3', '5')]
    Titles = [('General', 'Info', 'Titles'), ('More', 'Info', 'Section', 'Here'), ('Another', 'List', 'Of', 'Strings')]
    
    # Flat a list of tuples into a list
    l1 = [item for sublist in Section for item in sublist]
    l2 = [item for sublist in Page for item in sublist]
    l3 = [item for sublist in Titles for item in sublist]
    
    # Python2, `zip` returns a list of tuples
    #result = zip(*sorted(zip(l1, l2, l3), key=lambda x:float(x[0])))
    
    # Python3, `zip` returns an iterator of tuples
    result = list(zip(*sorted(zip(l1, l2, l3), key=lambda x:float(x[0]))))
    
    print(result)
    # Output
    [   ('1', '1', '1', '1.1', '1.2', '1.2', '2', '2.2', '3', '3.2', '3.5'), 
        ('1', '1', '1', '1', '3', '2', '2', '2', '2', '3', '5'), 
        ('General', 'More', 'Another', 'Info', 'Titles', 'List', 'Info', 'Section', 'Here', 'Of', 'Strings')]
    
    0 讨论(0)
  • 2021-01-18 05:44

    You can do:

    from itertools import chain
    
    tuples = zip(map(float, list(chain(*Section))), 
                 list(chain(*Page)), 
                 list(chain(*Title)))
    
    zip(*sorted(tuples, key=lambda x: x[0]))
    
    Out[232]:
    [(1.0, 1.0, 1.0, 1.1, 1.2, 1.2, 2.0, 2.2, 3.0, 3.2, 3.5),
     ('1', '1', '1', '1', '3', '2', '2', '2', '2', '3', '5'),
     ('General',
      'More',
      'Another',
      'Info',
      'Titles',
      'List',
      'Info',
      'Section',
      'Here',
      'Of',
      'Strings')]
    

    Here you first unnest your three list (what list(chain(*L)) does) and pack them in tuples with zip. Tip "tuples" to see how it looks.

    Then on the second line of code you can apply the sorting according to the element of the tuple you want. And you unpack the result.

    0 讨论(0)
提交回复
热议问题