【发布时间】:2011-05-28 16:13:24
【问题描述】:
有没有比编写一个提取嵌套元组值的 itemgetter 替代方案更好的方法来按嵌套元组值对列表进行排序:
def deep_get(*idx):
def g(t):
for i in idx: t = t[i]
return t
return g
>>> l = [((2,1), 1),((1,3), 1),((3,6), 1),((4,5), 2)]
>>> sorted(l, key=deep_get(0,0))
[((1, 3), 1), ((2, 1), 1), ((3, 6), 1), ((4, 5), 2)]
>>> sorted(l, key=deep_get(0,1))
[((2, 1), 1), ((1, 3), 1), ((4, 5), 2), ((3, 6), 1)]
我考虑过使用 compose,但标准库中没有:
sorted(l, key=compose(itemgetter(1), itemgetter(0))
我在库中遗漏了什么可以使这段代码更好看的东西吗?
实现应该可以合理地处理 100k 个项目。
上下文:我想对直方图项目的字典进行排序。键是元组 (a,b),值是计数。最后,项目应按计数降序、a 和 b 排序。另一种方法是将元组展平,直接使用itemgetter,但是这样会生成很多元组。
【问题讨论】:
-
我不知道。你的方法很好,因为它是恕我直言。
-
"实现应该可以合理地处理 100k 个项目。" -- 这行是不必要的;所有使用
sort的实现都可以合理地处理 100k 个项目 -
@ninjagecko 如果您对 3 个项目或 100k 或 1T 进行排序,实现会有所不同。