Сортировка словаря кортежей в Python - PullRequest
9 голосов
/ 08 сентября 2011

Я знаю, что уже есть тонны вопросов в списках / словарях сортировки Python, но я не могу найти тот, который поможет в моем случае, и я ищу наиболее эффективное решение, поскольку я собираюсь сортироватьдовольно большой набор данных.

В настоящее время мои данные в основном выглядят так:

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

Я в основном создаю список слов, в котором я храню каждое слово вместе с некоторыми статистическими данными о нем.(n, Sigma (x), Sigma (x ^ 2))

Я хочу отсортировать его на основе определенного показателя.До сих пор я пробовал что-то вроде:

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

Я не уверен, как контролировать, по какому индексу он сортируется, когда он фактически является списком кортежей кортежей?Полагаю, мне действительно нужно вложить две операции itemgetter, но я не совсем уверен, как это сделать.

Если есть лучшая структура данных, которую я должен использовать вместо этого, пожалуйста, дайте мне знать.Должен ли я, возможно, создать небольшой класс / структуру и затем использовать лямбда-функцию для доступа к члену класса?

Большое спасибо

Ответы [ 2 ]

6 голосов
/ 08 сентября 2011

Как то так?

>>> 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))]
1 голос
/ 08 сентября 2011

С именами легче работать и помните эти индексы, поэтому я бы пошел с классом:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...