在Python中对元组字典进行排序

12

我知道在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操作,但不太确定如何做到这一点。

如果应该使用更好的数据结构,请告诉我。也许我应该创建一个小类/结构,然后使用lambda函数来访问类的成员?

非常感谢

2个回答

9
像这样吗?
>>> 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))]

是的,非常好,谢谢!不过我在某个地方读到过,itemgetter 比使用 lambda 函数更快,因为它是 C 编译的。如果我不能使用 itemgetter,那么这个解决方案也可以。 - Dave White
1
在你拥有一个带有单元测试的可工作程序之前,不要担心性能。如果最终的正确程序太慢了,那么对其进行分析,并优化缓慢的部分。 - Ethan Furman
好的,谢谢你的指点 :) 如果速度太慢的话,我可能会用C重写它。 - Dave White
这是怎么回事?我收到了以下错误信息:AttributeError: 'dict' object has no attribute 'sort' - Ryan w

1

名称比索引更易于处理和记忆,因此我会选择使用类:

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)

非常有帮助,谢谢!你不会明确定义类定义中每个变量的类型吧? - Dave White
@technosites 如果你所说的“每个变量的类型”是指整数(int)、字符串(str)、浮点数(float)等,那么你可以使用属性进行数据验证等操作。 - Ethan Furman
@technosites 添加了一个属性示例。 - Ethan Furman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接