2012-07-21 3 views
4

Мне было интересно, как сортировать значения в списке, а затем разбивать как значения в под-список.Как сортировать значения в Python

Например: Я хотел бы функцию, которая, вероятно, что-то вроде

def sort_by_like_values(list): 
    #python magic 

>>>list=[2,2,3,4,4,10] 
>>>[[2,2],[3],[4,4],[10]] 
OR 
>>>[2,2],[3],[4,4],[10] 

я прочитал на отсортированном апи и хорошо работает для сортировки вещей в их собственном списке, но не нарушающих списки вверх в под-списки. Какой модуль мне поможет?

+1

'itertools.groupby() 'хорошо для такого рода вещей. –

ответ

5

Используйте модуль groupby из модуля itertools.

from itertools import groupby 

L = [2, 2, 3, 4, 4, 10] 

L.sort() 
for key, iterator in groupby(L): 
    print key, list(iterator) 

Результат:

 
2 [2, 2] 
3 [3] 
4 [4, 4] 
10 [10] 

Пар вещи, чтобы быть в курсе: groupby нужны данные, которые он работает на быть отсортирован по тому же ключу вы хотите группу, или его не будет Работа. Кроме того, итератор должен быть использован до перехода к следующей группе, поэтому убедитесь, что вы сохранили list(iterator) в другом списке или что-то в этом роде. Один лайнер дает вам результат, который вы хотите:

>>> [list(it) for key, it in groupby(sorted(L))] 
[[2, 2], [3], [4, 4], [10]] 
+0

Пригвожден! Хороший. Особенно понравилось понимание списка в конце. – NlightNFotis

2

Проверьте itertools модуля, он имеет полезную groupby функции:

import itertools as i 
for k,g in i.groupby(sorted([2,2,3,4,4,10])): 
    print list(g) 

.... 

[2, 2] 
[3] 
[4, 4] 
[10] 

Вы должны быть в состоянии изменить это, чтобы получить значение в списке ,

1

itertools.groupby() со списком понимание хорошо подходит.

In [20]: a = [1, 1, 2, 3, 3, 4, 5, 5, 5, 6] 

In [21]: [ list(subgroup) for key, subgroup in itertools.groupby(sorted(a)) ] 
Out[21]: [[1, 1], [2], [3, 3], [4], [5, 5, 5], [6]] 

Обратите внимание, что groupby() возвращает список итераторы, и вы должны потреблять эти итераторы в порядке. Согласно документам:

Возвращенная группа сама по себе является итератором, который разделяет базовый итерируемый с помощью groupby(). Поскольку источник является общим, , когда объект groupby() расширен, предыдущая группа больше не отображается. Таким образом, если эти данные необходимы позже, она должна храниться в виде списка:

2

Как все остальные предложил itertools.groupby (который был бы мой первый выбор) - это также возможно с collections.Counter для получения ключа и частоты, сортировать по ключу, а затем развернуть частоту.

from itertools import repeat 
from collections import Counter 

grouped = [list(repeat(key, freq)) for key, freq in sorted(Counter(L).iteritems())] 
1

Если вы не хотите использовать itertools и можете обернуть вокруг головы списковых, это также должно сделать трюк:

def group(a): 
    a = sorted(a) 
    d = [0] + [x+1 for x in range(len(a)-1) if a[x]!=a[x+1]] + [len(a)] 
    return [a[(d[x]):(d[x+1])] for x in range(len(d)-1)] 

где a твой список

+0

немного запоздал, но я просто попробовал, и он отлично работает – Greg

Смежные вопросы