2017-02-20 22 views
1

У меня есть список списков списков в python. Мне нужно отсортировать наивысший уровень списков на основе одного из значений на самых низких уровнях.Сортировка списка списков Python

Для игрушечной модели, мой список будет создан первым в списке small, который представляет собой список, содержащий списки с тремя пунктами каждые:

small = [["dog", 5, 6], ["cat", 391, 130], ["pig", 45, 2]...]` 

Тогда есть больший список, large, который создается путем добавления малый список и другой элемент вместе:

large.append([["category 1"], small])` 

Это делается в цикле, так что, если петля имеет счетчик 5, он будет проходить через функцию, которая создает список small 5 раз, каждый раз, добавляя это к li st large.

Моя цель - сортировать окончательный список на основе элемента в наименьшем списке (список, содержащий список small). В настоящее время я печатаю список large по строкам, с списком small, заказанным index 1 списков в нем (см.: 5,10,15 на заказ, 1,3,6 на заказ и т. Д.), Поэтому мой вывод это:

>category 1: 
    >['Dog', 5, 6] 
    >['Pig', 10, 2] 
    >['Cat', 15, 130] 
    >['Buffalo', 20, 1] 
    >['Newt', 25, 45] 

    >category 2: 
    >['Newt', 1, 1092] 
    >['Cat', 3, 352] 
    >['Pig', 6, 34] 
    >['Buffalo', 9, 12] 
    >['Dog', 12, 5] 

    >category 3: 
    >['Buffalo', 2, 12] 
    >['Pig', 4, 37] 
    >['Cat', 6, 34] 
    >['Newt', 8, 150] 
    >['Dog', 10, 52] 

Однако, я хотел бы напечатать large список в порядке от наименьшего к наибольшему, если смотреть на элемент в index 1 в списке, который составляет наименьший массив. Так что мой идеальный результат будет таким:

>category 2: 
    >['Newt', 1, 1092] 
    >['Cat', 3, 352] 
    >['Pig', 6, 34] 
    >['Buffalo', 9, 12] 
    >['Dog', 12, 5] 

    >category 3: 
    >['Buffalo', 2, 12] 
    >['Pig', 4, 37] 
    >['Cat', 6, 34] 
    >['Newt', 8, 150] 
    >['Dog', 10, 52] 

    >category 1: 
    >['Dog', 5, 6] 
    >['Pig', 10, 2] 
    >['Cat', 15, 130] 
    >['Buffalo', 20, 1] 
    >['Newt', 25, 45] 

Я попытался сортировки с itemgetter(), однако, при сортировке large с itemgetter(), я могу только сортировать элементы в списке large, которые [category x] и [[a,b,c], [a,b,c]]. Есть ли способ получить доступ к наименьшему уровню элементов для itemgetter? или другой способ сортировки этого списка?

Спасибо.

+2

Сначала напишите как обычный цикл, а затем посмотрите, как сделать его более простым или более эффективным. –

+0

Вложенная индексация? 'large [i] [j] [1]' – f5r5e5d

ответ

2

Это может быть сделано в одной строке:

sorted_large = sorted(large, key=lambda item: item[1][0][1]) 

Встроенная функция sorted принимает key параметр:

key задает функцию одного аргумента, который используется для извлечения контрольный ключ из каждого элемента списка

Использование lambda, ключ сортировки можно извлечь.

+0

Это было прекрасно, я пробовал много вещей, но не получил правильного синтаксиса .. Спасибо! – Rene