2011-09-08 19 views
8

Wiem, że jest mnóstwo pytań na temat list sortowania/słowników Pythona, ale nie mogę znaleźć takiego, które pomaga w moim przypadku, i szukam najbardziej wydajnego rozwiązania, jak Będę sortować raczej duży zbiór danych.Sortowanie słownika krotek w języku Python

moje dane w zasadzie wygląda to w tej chwili:

a = {'a': (1, 2, 3), 'b': (3, 2, 1)} 

Ja w zasadzie tworzenia listy słów, w której każde słowo przechowywać wraz z niektórych statystykach o nim (n, Sigma (x), Sigma (x^2))

Chcę go posortować według określonej statystyki. Dotychczas Próbowałem coś wzdłuż linii:

b = a.items() 
b.sort(key = itemgetter(1), reverse=True) 

Nie jestem pewien, jak kontrolować których indeks jest sortowane na podstawie gdy jej skutecznie listą krotek krotki? Sądzę, że muszę skutecznie zagnieździć dwie operacje itemgetter, ale nie jestem do końca pewien, jak to zrobić.

Jeśli istnieje lepsza struktura danych, której powinienem używać, proszę dać mi znać. Czy powinienem utworzyć małą klasę/strukturę, a następnie użyć funkcji lambda, aby uzyskać dostęp do członka klasy?

Wielkie dzięki

Odpowiedz

4

Coś takiego?

>>> a = {'a': (1, 2, 3), 'b': (3, 2, 1)} 
>>> b = a.items() 
>>> b 
[('a', (1, 2, 3)), ('b', (3, 2, 1))] 
>>> b.sort(key=lambda x:x[1][2]) # sorting by the third item in the tuple 
>>> b 
[('b', (3, 2, 1)), ('a', (1, 2, 3))] 
+0

tak, idealny dzięki! Czytałem gdzieś, że itemgetter jest szybszy niż przy użyciu funkcji lambda, ponieważ skompilowano C? Jeśli nie mogę użyć itemgettera, to rozwiązanie jest w porządku. –

+0

Nie przejmuj się wydajnością, dopóki nie masz działającego programu, wraz z testami jednostkowymi. Jeśli ostateczny, * poprawny *, program jest zbyt wolny, należy go profilować i zoptymalizować wolne bity. –

+0

dobry punkt :) Mogę przepisać go w C, jeśli jest zbyt wolny mimo to, dzięki za wskazówki :) –

1

Nazwy są łatwiej pracować i pamiętać, że indeksy, więc pójdę z klasą:

class Word(object):  # don't need `object` in Python 3 
    def __init__(self, word): 
     self.word = word 
     self.sigma = (some calculation) 
     self.sigma_sq = (some other calculation) 
    def __repr__(self): 
     return "Word(%r)" % self.word 
    def __str__(self): 
     return self.word 
    @property 
    def sigma(self): 
     return self._sigma 
    @sigma.setter    # requires python 2.6+ 
    def sigma(self, value): 
     if not value: 
      raise ValueError("sigma must be ...") 
     self._sigma = value 

word_list = [Word('python'), Word('totally'), Word('rocks')] 
word_list.sort(key=lambda w: w.sigma_sq) 
+0

to jest pomocne dzięki! Nie sądzisz, że wyraźnie zdefiniujesz typ każdej zmiennej w klasie def? –

+0

@technosites Jeśli przez "typ każdej zmiennej" rozumiesz int vs str vs float etc, możesz użyć właściwości do sprawdzania poprawności danych i do czego. –

+0

tak to miałem na myśli, dziękuję :) –

Powiązane problemy