在一种或另一种形式中,您将希望将产品和项目一起放入某种集合中,然后使用总计作为排序键但返回名称。
在每种情况下,sort 的 key 参数都包含对 函数 的引用,该函数采用正在排序的元素之一并返回用于确定该元素的排序位置的键元素。
2 元组列表示例。 (item, total)
def top3(products, amounts, prices):
item_totals = []
for item, num1, num2 in zip(products, amounts, prices):
item_totals.append((item, num1 * num2))
item_totals.sort(key=lambda t: t[1], reverse=True)
return [t[0] for t in item_totals]
这里,lambda t: t[1] 用于构造一个函数,该函数接受 2 元组并返回第二项,即总数。相当于定义了一个小函数:
def get_sort_key(t):
return t[1]
然后传递函数:
item_totals.sort(key=get_sort_key, reverse=True)
词典列表示例
为了更好的可读性而不是使用 2 元组列表,我们可以使用带有键 'item' 和 'total' 的字典列表:
def top3(products, amounts, prices):
item_totals = []
for item, num1, num2 in zip(products, amounts, prices):
item_totals.append({'item': item, 'total': num1 * num2})
item_totals.sort(key=lambda t: t['total'], reverse=True)
return [t['item'] for t in item_totals]
在这种情况下,您可以使用 operator 包中的 itemgetter 来生成可以代替 lambda 的函数。你会使用:
from operator import itemgetter
然后对sort 的调用可以更改为:
item_totals.sort(key=itemgetter('total'), reverse=True)
单字典示例
我们也可以将所有内容放入一个字典中,以乘积为键,以总数为值。但在这种情况下,它依赖于不重复的名称。
def top3(products, amounts, prices):
item_totals = {}
for item, num1, num2 in zip(products, amounts, prices):
item_totals[item] = num1 * num2
return sorted(item_totals.keys(),
key=lambda item: item_totals[item],
reverse=True)
有更紧凑的方法来编写所有这些,这避免了在排序之前构建集合时显式 for 循环的需要,正如其他一些答案所证明的那样,但这是一般原则。