filter 、map 、reduse、sorted 作用、特性及实例

本文深入探讨Python中的filter(), map(), reduce() 和 sorted() 函数的使用方法及应用场景,通过实例展示了如何利用这些函数高效地处理数据序列。
部署运行你感兴趣的模型镜像

  filter map reduse sorted
作用 接收一个函数和一个序列, filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。 map()函数接收两个参数,一个是函数,一个是Iterablemap将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。 reduce把一个函数作用在一个序列[x1, x2, x3, ...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算
1、sorted()函数是对列表里元素(元素既可以是数字也可以是字符串甚至是tuple、list)按照key 进行reverse = True 
或者 reverse = False 次序排序。
特性

filter()这个高阶函数,关键在于正确实现一个“筛选”函数。

注意到filter()函数返回的是一个Iterator,也就是一个惰性序列,所以要强迫filter()完成计算结果,需要用list()函数获得所有结果并返回list。
map()传入的第一个参数是f,即函数对象本身。由于结果r是一个IteratorIterator是惰性序列,因此通过list()函数让它把整个序列都计算出来并返回一个list。    
例子

1、在一个list中,删掉偶数,只保留奇数,可以这么写:

def is_odd(n):
    return n % 2 == 1

list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15]))
# 结果: [1, 5, 9, 15]

2、把一个序列中的空字符串删掉,可以这么写:

def not_empty(s):
    return s and s.strip()

list(filter(not_empty, ['A''''B'None'C''  ']))
# 结果: ['A', 'B', 'C']

1、
def f(x):...     return x * x
...
>>> r = map(f, [123456789])
>>> list(r)
[149162536496481]

2、把这个list所有数字转为字符串:

>>> list(map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
['1', '2', '3', '4', '5', '6', '7', '8', '9']
1、

考虑到字符串str也是一个序列,对上面的例子稍加改动,配合map(),我们就可以写出把str转换为int的函数:

>>> from functools import reduce
>>> def fn(x, y):...     return x * 10 + y
...
>>> def char2num(s):...     return {'0'0'1'1'2'2'3'3'4'4'5'5'6'6'7'7'8'8'9'9}[s]
...
>>> reduce(fn, map(char2num, '13579'))
13579

2、比方说对一个序列求和,就可以用reduce实现:

>>> from functools import reduce
>>> def add(x, y):...     return x + y
...
>>> reduce(add, [13579])
25
、假设我们用一组tuple表示学生名字和成绩:

L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]

请用sorted()对上述列表分别按名字排序:
# -*- coding: utf-8 -*-

L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]

def by_name(t):

解:
def by_score(t):
    return s[t].lower()
  L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]
L2 = sorted(L, key = by_score,reverse = True)
>>> print(L2)
[('Lisa', 88), ('Bob', 75), ('Bart', 66), ('Adam', 92)]
         

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

### 错误原因 在 C 语言中,`switch` 语句中的 `case` 标签要求其值必须是一个可以被编译器计算为整数常量的表达式。如果 `case` 标签的值不是一个整数常量表达式,则会引发错误 `case label does not reduce to an integer constant`。 根据提供的引用内容[^1]和[^2],以下情况会导致该错误: - 使用非整数类型的表达式作为 `case` 的标签值。 - 使用无法在编译时解析为整数常量的表达式,例如变量、函数调用或某些复杂的数学运算结果。 例如,在引用[^2]中提到的例子: ```c case a*b: case a-b: ``` 这些表达式涉及变量 `a` 和 `b` 的运算,而它们不是编译时常量,因此会导致错误。 此外,引用[^3]中明确指出,允许使用的 `case` 常量包括: - 整数常量(如 `0`, `1` 等)。 - 字符常量(如 `'A'`)。 - 枚举常量(如 `ZERO`, `ONE` 等)。 - `sizeof` 表达式的结果(因为它是编译期常量)。 - 强制类型转换后的浮点数(如 `(int)5.0`)。 ### 解决方案 为了修复此错误,需要确保所有 `case` 标签的值都是编译期可解析的整数常量。以下是几种解决方法: #### 方法一:使用整数常量 将 `case` 标签替换为整数常量。例如: ```c switch (value) { case 1: // 处理逻辑 break; case 2: // 处理逻辑 break; } ``` #### 方法二:使用枚举类型 如果需要更清晰地表示不同的状态,可以使用 `enum` 定义一组符号常量。例如: ```c typedef enum { ZERO, ONE, TWO } Numbers; switch (value) { case ZERO: // 处理逻辑 break; case ONE: // 处理逻辑 break; case TWO: // 处理逻辑 break; } ``` #### 方法三:使用宏定义 通过宏定义来代替直接写入数值,增强代码的可读性和维护性。例如: ```c #define VALUE_ONE 1 #define VALUE_TWO 2 switch (value) { case VALUE_ONE: // 处理逻辑 break; case VALUE_TWO: // 处理逻辑 break; } ``` #### 方法四:确保表达式为编译期常量 如果确实需要使用复杂表达式作为 `case` 标签值,确保它能在编译时解析为整数常量。例如: ```c const int two = 2; switch (value) { case 1: // 处理逻辑 break; case two: // `two` 是一个编译期常量 // 处理逻辑 break; } ``` 需要注意的是,引用[^5]中的示例展示了如何正确使用 `const` 变量作为 `case` 标签值。 ### 示例代码 以下是一个完整的示例,展示如何避免 `case label does not reduce to an integer constant` 错误: ```c #include <stdio.h> typedef enum { SMALL, MEDIUM, LARGE } Size; int main() { int size = 2; switch (size) { case SMALL: // 使用枚举常量 printf("Small size\n"); break; case MEDIUM: // 使用枚举常量 printf("Medium size\n"); break; case LARGE: // 使用枚举常量 printf("Large size\n"); break; default: printf("Unknown size\n"); } return 0; } ``` ### 注意事项 - 如果尝试使用变量、函数调用或其他运行时才能确定的值作为 `case` 标签值,将会导致编译错误。 - 使用 `const` 关键字定义的变量可以作为 `case` 标签值,但前提是它的值在编译时即可确定。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值