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

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

I want to combine them such as

Combined_List = [('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')]

Or any other form that allows me to then sort them by the numbers in the list titled sections.

In this case it would be

  Sorted_list = [('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')

I need it like this so I can eventually export a sorted list by Section into excel. If you can think of a better way to display/format please do share!


尝试这个,

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

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.


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']]
链接地址: http://www.djcxy.com/p/34532.html

上一篇: 如何在小图片上使用Opencv FeatureDetecter

下一篇: 梳理元组的二维列表,然后用Python对它们进行排序