一道题让你真正理解Python编程
幸运数的定义:从“幸运”开始
[3, 5, 2, 7, 3, 1, 2 ,4, 8, 9, 3],如果数字 3 出现了3次,那么它就是一个幸运数。基本上,我们就是要找出那些满足“数字 = 出现次数”条件的数字。set,map,zip,lambda,sorted,生成器和迭代器。这些特性如果用得好,代码会既简洁又高效。第一步:去重—避免重复计算
3 就出现了3次,数字 2 出现了2次,等等。如果我们直接统计列表里的所有元素,很多重复的数字就会浪费计算资源。所以,第一步我们得先去重。set 类型能轻松解决这个问题。set 是一个无序不重复元素集合,可以将一个列表转化为集合,从而去掉重复的数字。numbers = [3, 5, 2, 7, 3, 1, 2 ,4, 8, 9, 3]
unique_numbers = set(numbers) # 使用 set 去重
print(unique_numbers) # 输出: {1, 2, 3, 4, 5, 7, 8, 9}
第二步:统计出现次数—count()方法来帮忙
count() 方法,能够直接返回某个元素在列表中出现的次数。所以,我们可以直接用它来遍历去重后的数字,并统计每个数字出现的次数。# 统计每个数字出现的次数
counted_numbers = [(num, numbers.count(num)) for num in unique_numbers]
print(counted_numbers) # 输出: [(1, 1), (2, 2), (3, 3), (4, 1), (5, 1), (7, 1), (8, 1), (9, 1)]
第三步:过滤幸运数—filter()筛选
filter() 函数可以非常方便地帮我们完成这个任务。# 过滤出幸运数
lucky_numbers = list(filter(lambda x: x[0] == x[1], counted_numbers))
print(lucky_numbers) # 输出: [(3, 3)]
lambda 是一个匿名函数,它用来判断数字是否等于它的出现次数。filter() 函数会返回一个迭代器,包含所有符合条件的元素。最后,我们将结果转化为列表来查看。第四步:排序—sorted()来排序
sorted() 函数就派上了用场。# 对幸运数排序
sorted_lucky_numbers = sorted(lucky_numbers, key=lambda x: x[0])
print(sorted_lucky_numbers) # 输出: [(3, 3)]
sorted() 函数可以对任何可迭代对象进行排序,通过 key 参数我们指定按照元组中的第一个值(即数字本身)进行排序。使用Python的高级功能
map(),zip(),lambda,filter() 和 sorted())确实让代码变得简洁而又强大。接下来,我想深入探讨一下这些函数的使用。** map()**:map()函数接受一个函数和一个可迭代对象,将这个函数作用于可迭代对象的每个元素并返回结果。可以替代for循环,使代码更加简洁。
# 使用 map 代替 for 循环统计出现次数
counts = list(map(lambda x: numbers.count(x), unique_numbers))
print(counts) # 输出: [3, 2, 3, 1, 1, 1, 1, 1]
** zip()**:zip()函数能够将多个可迭代对象“打包”在一起,返回一个元组的迭代器。它非常适合在需要配对元素时使用。
# 使用 zip 将数字和它们的出现次数打包成元组
zipped = list(zip(unique_numbers, counts))
print(zipped) # 输出: [(1, 1), (2, 2), (3, 3), (4, 1), (5, 1), (7, 1), (8, 1), (9, 1)]
生成器和迭代器:生成器(如 map()和filter()返回的对象)是懒加载的,它们不会一次性返回所有结果,而是每次请求时返回一个值。这有助于提高性能,尤其是在处理大量数据时。
# 使用生成器避免多次遍历
generator = filter(lambda x: x[0] == x[1], counted_numbers)
# 迭代器不会一次性生成所有数据,直到我们需要它
最后的优化:一行搞定
lucky_numbers = sorted(
filter(lambda x: x[0] == x[1],
zip(unique_numbers, map(lambda x: numbers.count(x), unique_numbers))))
print(lucky_numbers) # 输出: [(3, 3)]
结语:如何平衡简洁和可读性
count() 和列表推导式就能解决问题,而且代码更易理解:lucky_numbers = [num for num in unique_numbers if numbers.count(num) == num]
print(sorted(lucky_numbers)) # 输出: [3]
对编程、职场感兴趣的同学,大家可以联系我微信:golang404,拉你进入“程序员交流群”。
虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》。