Python-map从基础到进阶
无论你是打打算法比赛还是做项目map函数肯定都是你必学内置函数,这篇文章小白也能轻松掌握map函数,学习map,理解map,进阶用法map
描述
map() 函数会根据提供的函数对指定序列做映射。
第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。
语法
以下是 map() 方法的语法:
map(function, iterable, ...)
参数
- function -- 函数
- iterable -- 一个或多个序列
返回值
返回一个迭代器。
实例
def pow2(x):return x * x
nums = [1, 2, 3, 4, 5, 6 ,7]
print(list(map(pow2, nums)))
#map(pow2, nums))这是一个迭代器,list就相当于读取,把他读出写成列表形式#输出[1, 4, 9, 16, 25, 36, 49]
值得注意的是 map(pow2, nums))这是一个迭代器,list就相当于读取,把他读出写成列表形式
若print(map(func, iterable)) 则输出的是迭代器这个容器名称和位置参数,而不是具体的值
进阶
&split结合:
如果大家打蓝桥杯比赛这个就很有生活了。
比如让你按照要求输入:
输入格式
输入的第一行包含两个正整数 n,m ,用一个空格分隔,其中 n 表示人数,m 表示每一个人有m个初始属性值。
接下来 n 行,每行包含m个非负整数 1...i....m,相邻整数之间使用一个空格分隔,每一个整数表示相应位置的属性初始值
4 4
1 2 3 4
4 5 6 7
9 8 7 4
4 5 6 7
如果遇到这种情况,如果你第一次写肯定十分迷糊,但是只要记住这样的格式就轻而易举了
首先回顾一下map的作用是讲后面的 iterable 每一项都执行 function 操作,split(‘@’)表示以 @ 分割可迭代的数据, 如果split()就是指以空格为分割器分隔, 为什么map里是int,因为所有输入的都是字符串或者字符,而我们要得到整数类型的数据,所以要用int,你可以联想一下
n = int(input())
n, m = map(int, input().split())nums = []
for q in range(n):nums.append([])nums[-1] = list(map(int, input().split()))
当然对于第二行开始的数据还有一种十分简便的写法:
nums = [list(map(int, input().split())) for q in range(n)]
记住Python本身就是十分简单的代码,就要利用这个简洁的特性,否者为什么不用C ++ 毕竟C ++跑的更快。
&初始化工具
在一些题目中往往需要对字符串初始化,就是只要需要初始化,map绝对是十分高效的工具,
例如:
在 ‘abcdefghijkdsidwidjkdjwidndskjd’ 中找到最长的连续的子字符串,连续就是指ab, za, cd abcd这种子字符串,子字符串是指连续的,例如本例子中最长连续子字符串是abcdefghijk
那么在计算机中我们如何判断是否连续呢,当然是判断其Unicode 如'a' 对应的是97,‘b’对应的是98,只要相邻相差1,值得注意的是(ord(a[i]) – ord(a[i-1])) % 26 == 1对于'za'这种特殊连续的情况仍然能够正确判断
a = 'abcdefghijkdjisdisdwdmsdwdkjsdw'
ans, cnt = 0, 1
for i in range(1, len(a)):if (ord(a[i]) – ord(a[i-1])) % 26 == 1:cnt += 1else:ans = max(ans, cnt)cnt = 1
print(ans)
从上面不难看出每一次都需要在for中单独判断不如直接一开始就初始化,
a = 'abcdefghijkdjisdisdwdmsdwdkjsdw'
a = list(map(ord, a))
ans, cnt = 0, 1
for i in range(1, len(a)):if (a[i] - a[i - 1]) % 26 == 1:cnt += 1else:ans = max(ans, cnt)cnt = 1
print(ans)
因此map一个十分重要的运用就是初始化工具
谢谢你看到这里,期待与你共同进步!