python初学者必会技巧 1 - 以key参数为钥,开启嵌套列表min ()、max ()、sorted () 函数的高效应用之门


在Python编程的日常工作与学习中,我们经常会与嵌套列表打交道,这类数据结构由多个子列表组成。当需要使用min()max()函数找出嵌套列表中的最小或最大元素时,尤其是基于子列表特定属性进行查找,对于Python新手而言,这是一个常见却颇具挑战性的问题。接下来,我们就通过具体实例,深入剖析并解决这个问题。

实际场景:销售数据分析

假设你在一家电商公司担任数据分析师,手头有一份月度销售数据,这些数据以嵌套列表形式存储。每个子列表都详细记录了一款商品的信息,包含商品ID、商品名称、销售数量、销售额四个字段,具体数据如下:

sales_data = [
    [1001, "T - Shirt", 500, 15000],
    [1002, "Jeans", 300, 24000],
    [1003, "Sneakers", 200, 30000],
    [1004, "Jacket", 150, 18000]
]

现在有两个关键需求:一是找出销售数量最少的商品,二是找出销售额最高的商品。那么,如何借助min()max()函数来实现这两个功能呢?

原因探究:Python的默认比较机制

要想解决上述问题,首先需要深入了解min()max()函数的底层运行逻辑。在Python中,对序列进行比较时遵循字典序规则。我们以max()函数为例,其核心实现逻辑可以用以下自定义函数简单模拟:

def custom_max(sequence):
    if not sequence:
        raise ValueError('序列为空')
    max_element = sequence[0]
    for element in sequence:
        if element > max_element:
            max_element = element
    return max_element

当序列中的元素是整数、浮点数等基本数据类型时,这种比较方式非常直观且容易理解。然而,当序列中包含嵌套列表时,情况就变得复杂起来。Python默认会从子列表的第一个元素开始,依次进行比较。就像在我们的销售数据案例中,如果直接使用min()max()函数,程序会先比较商品ID,从而得到以下不符合预期的结果:

print(min(sales_data))   # [1001, "T - Shirt", 500, 15000]
print(max(sales_data))   # [1004, "Jacket", 150, 18000]

可以看到,这样的结果并非我们想要的基于销售数量或销售额筛选出的最值商品信息。

解决方案:巧用key参数

既然已经清楚了问题产生的原因,聪明的你一定开始思考解决办法了。幸运的是,Python的min()max()函数都提供了一个强大的key参数,通过向该参数传入一个函数,我们可以自由指定比较的依据,也就是明确告诉函数应该比较子列表中的哪一个元素。

如果要找出销售数量最少的商品,我们可以定义一个函数,专门用于获取子列表中的销售数量字段:

def get_sales_count(item):
    return item[2]
print(min(sales_data, key=get_sales_count)) 
# [1004, 'Jacket', 150, 18000]

同理,若想找出销售额最高的商品,也需要定义相应的函数:

def get_sales_amount(item):
    return item[3]
print(max(sales_data, key=get_sales_amount)) 
# [1003, 'Sneakers', 200, 30000]

通过这种方式,我们就能得到符合需求的结果。此外,除了定义普通函数,我们还可以使用简洁的lambda表达式来实现相同功能。比如,查找销售额最高和销售数量最少的商品,代码可以写成:

print(min(sales_data, key=lambda x: x[2])) 
# [1004, 'Jacket', 150, 18000]
print(max(sales_data, key=lambda x: x[3])) 
# [1003, 'Sneakers', 200, 30000]

拓展应用:更多筛选可能

key参数的强大之处远不止于此,它的灵活性能够满足各种复杂的筛选需求。例如,我们想要找出平均单价(销售额除以销售数量)最高的商品,就可以通过以下代码实现:

print(max(sales_data, key=lambda x: x[3]/x[2] if x[2] != 0 else 0))
# [1003, 'Sneakers', 200, 30000]

我们还可以按照商品名称的字母顺序对数据进行排序:

print(sorted(sales_data, key=lambda x: x[1]))
# [
#  [1001, 'T - Shirt', 500, 15000],
#  [1004, 'Jacket', 150, 18000],
#  [1002, 'Jeans', 300, 24000],
#  [1003, 'Sneakers', 200, 30000]
# ]

按照销售额从低到高对商品数据进行排序:

print(sorted(sales_data, key=lambda x: x[3]))
# [
#  [1001, 'T - Shirt', 500, 15000],
#  [1004, 'Jacket', 150, 18000],
#  [1002, 'Jeans', 300, 24000],
#  [1003, 'Sneakers', 200, 30000]
# ]

按照销售数量的降序排列:

print(sorted(sales_data, key=lambda x: x[2], reverse=True))
# [
#  [1001, 'T - Shirt', 500, 15000],
#  [1002, 'Jeans', 300, 24000],
#  [1003, 'Sneakers', 200, 30000],
#  [1004, 'Jacket', 150, 18000]
# ]

经验总结

在处理嵌套列表中min()max()以及sorted()函数的应用问题时,核心要点在于深入理解Python的默认比较机制,并熟练掌握key参数的使用,通过它来自定义符合需求的比较规则。从前面的销售数据分析场景可以看出,在编程过程中,不能仅仅依赖直觉简单调用函数,而是要深入探究函数的运行原理。掌握了这些技巧,在今后处理类似的复杂数据筛选与排序问题时,就能更加得心应手、游刃有余。

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dudly

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值