-
map for循环
2020-08-27 14:41:32Map<String, Object> map = new HashMap<String, Object>(); map.put("aaa", 111); map.put("bbb", 222);... for(String key:map.keySet()){//keySet获取map集合key的集合 然后在遍历keyMap<String, Object> map = new HashMap<String, Object>(); map.put("aaa", 111); map.put("bbb", 222); map.put("ccc", 333); map.put("ddd", 444); for(String key:map.keySet()){//keySet获取map集合key的集合 然后在遍历key }
-
map for循环_如何用Map、Filter和Reduce替换Python For循环?
2020-11-29 02:49:51全文共2375字,预计学习时长7分钟图源:Unsplash屏幕前的你,瞅瞅看,你的代码是不是通篇都是For循环?是不是眯眼靠近屏幕才能看清自己的代码?没错,我就是这样的。(难以切齿)For循环是解决问题的瑞士军刀,非常...全文共2375字,预计学习时长7分钟
图源:Unsplash
屏幕前的你,瞅瞅看,你的代码是不是通篇都是For循环?是不是眯眼靠近屏幕才能看清自己的代码?
没错,我就是这样的。(难以切齿)
For循环是解决问题的瑞士军刀,非常好用,但是当浏览代码想看看自己做了什么的时候,它们会把你淹没。
此时,Map, filter和 reduce三种技术可以帮到你。
它们可以通过提供描述迭代原因的函数替代选择,来矫正For循环的狂热。
图源:Unsplash
在之前的文章里,小芯有介绍过 JavaScript里使用这些技术,但是在Python中的实现稍许有些不同。
下面将分别简要介绍三种技术,重点强调它们在JavaScript和Python中的语法不同,然后举出如何替换常见For循环的示例。
Map, Filter, 和Reduce是什么?
回顾之前写的代码,我意识到当循环字符串或数组时,95%的情况下,我都在做如下的事情之一:将系列语句映射(Map)到每个值,过滤(Filter)掉满足特定情况的值,或者将数据集减少(Reduce)到单个聚合值。
基于这种观点,这三种方法是识别和实现,因为循环迭代的原因通常对应以下三种功能类型之一:
· Map:对每个项应用相同的步骤集,储存结果。
· Filter: 应用验证条件,储存计算值为True的项。
· Reduce: 返回从一个元素传递到另一个元素的值。
是什么让Map、Filter、Reduce与众不同?
在Python中,这三种技术易函数的形式存在,而不是Array或String类的方法。这意味着要写成map(function, my_list)而不是my_array.map(function)。
此外,每个技术都需要传递函数,该函数会被每个项执行。通常而言,函数会写成匿名函数,在JavaScript中叫胖箭头函数。但是在Python中会经常使用lambda表达式。
Lambda表达式和箭头函数之间的语法其实非常相似。将=>替换为:,确保使用了关键词lambda,剩下的几乎就完全相同。
- // JavaScript Arrow Function
- const square = number => number * number;// Python Lambda Expression
- square = lambda number: number * number
Lambda表达式和箭头函数之间的一个关键区别是,箭头函数可以扩展成有多个语句的完整函数,而lambda表达式只限于一个能返回的表达式。因此当使用map(), filter()或 reduce()时,如果需要对每个项执行多个操作,需要先定义函数,再把函数使用进去。
- def inefficientSquare(number):
- result = number * number
- return resultmap(inefficientSquare,my_list)
替换For循环
下面是三个常见的For循环示例,分别用map, filter和 reduce替换掉。编程目的:计算列表中奇数的平方和。
首先是基本的For循环示例。请注意:这纯粹是为了演示,即使没有map/filter/reduce也可以改进它。
- numbers = [1,2,3,4,5,6]
- odd_numbers = []
- squared_odd_numbers = []
- total = 0# filter for odd numbers
- for number in numbers:
- if number % 2 == 1:
- odd_numbers.append(number)# squareall odd numbers
- for number in odd_numbers:
- squared_odd_numbers.append(number *number)# calculate total
- for number in squared_odd_numbers:
- total += number# calculate average
将每个步骤替换为一个函数:
- from functools importreducenumbers = [1,2,3,4,5,6]odd_numbers = filter(lambda n: n % 2 == 1,numbers)squared_odd_numbers = map(lambda n: n * n, odd_numbers)total =reduce(lambda acc, n: acc + n, squared_odd_numbers)
有几个重要语法要点需要强调。
· map() 和 filter() 原生可用。但是reduce() 必须从 Python3+中的functools 库里导入。
· Lambda表达式是所有三个函数里的第一个参数,而迭代表达式是第二个参数。
· reduce()的Lambda表达式需要两个参数: accumulator (传递给每个元素的值)和单个元素本身。
图源:Unsplash
诚然,For循环在代码中不可或缺,但是过度使用未免有点单调,学习新知识为自己的代码锦上添花,不是更好吗?
毕竟,学习新知识可不是坏事,小芯更不是什么魔鬼。(坏笑)
最后,衷心祝愿大家远离洪水般的For循环。
留言点赞关注
我们一起分享AI学习与发展的干货
如转载,请后台留言,遵守转载规范
-
map for循环_R学习:R for Data Science 循环-迭代 purrr 函数代替 for 循环
2020-12-04 13:41:12R学习往期回顾:R学习:R for Data Science 循环-迭代(for while))R学习:R for Data Science 向量(1)R学习:R for Data Science 向量(2)R学习 从Tidyverse学起,入门R语言 dplyr合并数据R学习 流程控制 if,...R学习往期回顾:
R学习:R for Data Science 循环-迭代(for while))
R学习:R for Data Science 向量(1)
R学习:R for Data Science 向量(2)
R学习 从Tidyverse学起,入门R语言 dplyr合并数据
R学习 流程控制 if,else,ifelse
R学习 从Tidyverse学起,入门R语言(tidyr和stringr)
R学习 从Tidyverse学起,入门R语言(tibble,readr和dplyr)
R学习:字符串
R学习:环境和函数
R学习:数据框的基本操作
R学习:R for Data Science(五)
R学习:R for Data Science(四)
R学习:R for Data Science(三)
R学习:R for Data Science(二)
R学习:R for Data Science(一)
for循环与函数式编程
for 循环在 R 中不像在其他语言中那么重要,因为 R 是一门函数式编程语言。这意味着可以先将 for 循环包装在函数中,然后再调用这个函数,而不是直接使用 for 循环
library(tidyverse) df <- tibble( a = rnorm(10), b = rnorm(10), c = rnorm(10), d = rnorm(10) )
假设想要计算每列的均值。你可以使用 for 循环来完成这个任务
output <- vector("double", length(df)) for (i in seq_along(df)) { output[[i]] <- mean(df[[i]]) } output
将这段代码提取出来,转换成一个函数:
col_mean <- function(df) { output <- vector("double", length(df)) for (i in seq_along(df)) { output[i] <- mean(df[[i]]) } output }
还可以算每列的中位数和标准差
col_median <- function(df) { output <- vector("double", length(df)) for (i in seq_along(df)) { output[i] <- median(df[[i]]) } output } col_sd <- function(df) { output <- vector("double", length(df)) for (i in seq_along(df)) { output[i] <- sd(df[[i]]) } output }
通过添加支持函数应用到每列的一个参数,我们可以使用同一个函数完成与 col_mean()、col_median() 和 col_sd() 函数相同的操作:
col_summary <- function(df, fun) { out <- vector("double", length(df)) for (i in seq_along(df)) { out[i] <- fun(df[[i]]) } out } col_summary(df, median) col_summary(df, mean)
将函数作为参数传入另一个函数的这种做法是一种非常强大的功能,它是促使 R 成为函数式编程语言的因素之一。
我们将学习和使用 purrr 包,它提供的函数可以替代很多常见的 for 循环应用。 R 基础包中的应用函数族(apply()、 lapply()、 tapply() 等)也可以完成类似的任务,但 purrr 包中的函数更一致,也更易于学习。使用 purrr 函数代替 for 循环的目的是将常见的列表处理问题分解为独立的几个部分。
• 对于列表中的单个元素,你能找到解决问题的方法吗?如果找到了解决方法,那么你就可以使用 purrr 将这种方法扩展到列表中的所有元素。• 如果你面临的是一个非常复杂的问题,那么如何将其分解为几个可行的子问题,然后循序渐进地解决,直至完成最终的解决方案?使用 purrr,你可以解决很多子问题,然后再通过管道操作将这些问题的结果组合起来。
映射函数
先对向量进行循环、然后对其每个元素进行一番处理,最后保存结果。这种模式太普遍了,因此 purrr 包提供了一个函数族来替你完成这种操作。每种类型的输出都有一个相应的函数:
• map() 用于输出列表;
• map_lgl() 用于输出逻辑型向量;
• map_int() 用于输出整型向量;
• map_dbl() 用于输出双精度型向量;
• map_chr() 用于输出字符型向量。每个函数都使用一个向量作为输入,并对向量的每个元素应用一个函数,然后返回和输入向量同样长度(同样名称)的一个新向量。向量的类型由映射函数的后缀决定。
我们可以使用这些函数来执行与最后一个 for 循环相同的操作。因为那些摘要函数返回的是双精度数,所以我们需要使用 map_dbl() 函数:
map_dbl(df, median) map_dbl(df, mean)
map_*() 和 col_summary() 具有以下几点区别
• 所有 purrr 函数都是用 C 实现的。这使得它们的速度非常快,但牺牲了一些可读性
• 第二个参数(即 .f,要应用的函数)可以是一个公式、一个字符向量或一个整型向量
• map_*() 使用向 .f 传递一些附加参数,供其在每次调用时使用• 映射函数还可以保留名称
快捷方式
对于参数 .f,你可以使用几种快捷方式来减少输入量。假设你想对某个数据集中的每个分组都拟合一个线性模型。以下这个简单示例将 mtcars 数据集拆分成 3 个部分(按照气缸的值分类),并对每个部分拟合一个线性模型:
models <- mtcars %>% split(.$cyl) %>% map(function(df) lm(mpg ~ wt, data = df))
因为 R 中创建匿名函数的语法比较繁琐,所以 purrr 提供了一种更方便的快捷方式——单侧公式:
models <- mtcars %>% split(.$cyl) %>% map(~lm(mpg ~ wt, data = .))
我们在以上示例中使用了 . 作为一个代词:它表示当前列表元素(与 for 循环中用 i 表示当前索引是一样的)
需要提取出 R平方 这样的摘要统计量
需要先运行 summary() 函数,然后提取出结果中的 r.squared。我们可以使用匿名函数的快捷方式来完成这个操作:
models %>% map(summary) %>% map_dbl(~.$r.squared)
因为提取命名成分的这种操作非常普遍,所以 purrr 提供了一种更为简洁的快捷方式:使用字符串
models %>% map(summary) %>% map_dbl("r.squared")
后面需要有apply()家族函数的基础知识,为了循序渐进,后面我们将会介绍apply家族,下回见。
TCGA单基因免疫相关泛癌分析,懒人福音, 重磅来袭mp.weixin.qq.com
单基因泛癌分析链接公众号“生信小课堂”
TCGA数据分析课程:生物信息学教学
-
map for循环_第五节 数组热闹的循环
2020-12-04 13:41:131.数组是非常有用的,说数组就会用到的是循环 for循环: for(let i=0;i<arr.length;i++){}while循环2.ES6中新增的循环arr.forEach()-------代替普通的 for 循环arr.map()----------非常有用,做数据交互“映射” ...1.数组是非常有用的,说数组就会用到的是循环
for循环: for(let i=0;i<arr.length;i++){}
while循环
2.ES6中新增的循环
arr.forEach()-------代替普通的 for 循环
arr.map()----------非常有用,做数据交互“映射”
正常情况下,要配合 return,返回一个新的数组(平时使用 map,要用 return)
如果没有 return,就相当于forEach
arr.filter()----------过滤,过滤一些不合格的”元素“;如果回调函数返回true,就留下了。
arr.some()----------类似于查找,数组里某一个元素符合条件,返回true
arr.every()----------类似于查找,数组里每一个元素都要符合条件,才返回true
arr.reduce()----------求数组的和、阶乘 // 从左往右
arr.reduceRight()----求数组的和、阶乘 // 从右往左
ES2017新增了一个运算符:幂 **
之前求2的3次方:Math.pow(2,3) 现在:2**3
新增循环:for...of... 循环数组
例子1--传统循环
<script>
输出结果:a,b,c,d
例子2--arr.forEach() 循环
<script>
输出的结果 注意:
arr.forEach()、arr.map()、arr.filter()、arr.some()、arr.every()它们接收的参数一模一样,他们可以接收两个参数:(循环回调函数,this指向谁);
【说白了你循环想干什么就得放这里边儿,你希望this指向谁】
就是说 arr.forEach() 怎么用,其他的就怎么用,只是意思不同。
例子3--思考this指向
<script>
this 默认指向的是 window 例子4--第二个参数改为 this
<script>
this 指向 number了 例子5--arr.map() 不使用return情况
<script>
正常情况下,要配合 return,返回一个新的数组 ; 如果没有 return,就相当于forEach 例子6--arr.map() 使用return情况
<script>
平时使用 map,一定是要用 return 的 例子7--arr.map() 使用return情况,重新整理过的数据结构
结果就是整理好的 例子8--arr.filter() 过滤新闻为热点(hot:true)
<script>
结果就是2条数据 <script>
结论:arr.filter()--过滤,过滤一些不合格的”元素“; 如果回调函数返回true,就留下了!
例子9--arr.some()
<script> let arr=['apple','banana','orange']; let b=arr.some((val,index,arr)=>{ return val=='banana2'; }); console.log(b); </script>
输出的结果:false
结论:arr.some()--类似于查找,数组里某一个元素符合条件,返回true!
例子10--arr.every() 判断数组里面是不是都是奇数?
结果:true 结论:arr.every()--类似于查找,数组里每一个元素都要符合条件,才返回true!
例子11--arr.reduce()----------求数组的和、阶乘 // 从左往右
结果:55 类似于递归,搞算法用得比较多。(前面数的和再加当前的数以此循环相加)
结果:64 阶乘
例子12--幂运算符 (ES2017新增了一个运算符:幂 **)
之前求2的3次方:Math.pow(2,3)
结果:8 现在:2**3
<script>
结果是一样的:8
例子13--arr.reduceRight()----求数组的和、阶乘 // 从右往左
结果:81 例子14--新增循环:for...of... 循环数组
循环索引
综合
THANK YOU!下节见
-
map for循环_JavaScript 用 for 循环太 low?你是不是有什么误解
2020-12-04 13:41:16天要吐槽下,我时不时地看到有些文章说“循环语句不好,你应该用 filter,map 和 reduce ”——每次看到有...在许多情况下,如果你想写性能好的代码,for 循环基本上是更好的选择。map, filter 和reduce等方法的目... -
java map for循环遍历_Java Map 遍历
2021-02-12 18:59:40Map 概述Map 在 Java 中表示为键值对存储结构 Map,他的常用方法包括了get(Object key) 获取指定键(key)所对应的值(value)put(K key,V value) 将指定的键与值对应起来,并添加到集合中remove(Object key) 根据指定的... -
map for循环_【js】for、forEach、map数组遍历性能比较
2020-12-04 13:41:12原文链接:https://blog.csdn.net/qq24357165/article/details/82748976先上结果:遍历时间上 for循环遍历 <...背景常用的数组遍历方式有很多,如最经典的for循环 for (var i = 0; i < arr.leng... -
map for循环_C++基于范围的for循环(学习笔记:第6章 06)
2020-11-28 07:05:39基于范围的for循环[1]当我们用for循环来处理整个数组的时候,遍历数组元素的时候需要知道这个数组它一共有多少个元素,这样才可以用for循环来控制这个循环次数。C++11提供了一种新的for循环语句,即基于范围的for... -
map for循环_JavaScript数组循环的几种写法
2020-12-03 08:11:12而不是积累起来for循环和嵌套来处理列表和集合中的数据,您可以利用这些方法更好地将逻辑组织成功能的构建块,然后将它们链接起来以创建更可读和更易于理解的实现。ES6还为我们提供了一些更好的数组方法,比如.find,... -
java map for 循环遍历_Java Map遍历的3种方法
2021-03-08 04:40:48用for循环遍历for(Map.Entry entry:map.entrySet()){System.out.println(entry.getKey()+"--->"+entry.getValue());}2.用Iterator迭代遍历Set set = map.entrySet();Iterator i = set.iterator();while(i.... -
map for循环_JavaScript ES6—Map的妙用
2020-11-30 03:40:03多重嵌套 for 循环太丑,运行效率又低,有没有什么办法可以降低它的嵌套层数?游戏内怎么简洁优雅的获取我想要的数据,又有良好的智能提示效果?有没有通用的提高运行效率的方案?没错,ES6 的 Map 就是为你定制的。... -
map for循环_还在为Python For循环烦恼?快来掌握这三种技术
2020-11-27 10:09:31全文共2375字,预计学习时长7分钟图源:Unsplash屏幕前的你,瞅瞅看,你的代码是不是通篇都是For循环?是不是眯眼靠近屏幕才能看清自己的代码?没错,我就是这样的。(难以切齿)For循环是解决问题的瑞士军刀,非常... -
java map for循环遍历_java中Map遍历的四种方式
2021-02-28 06:06:19java中Map遍历的四种方式在java中所有的map都实现了Map接口,...方法一:在for循环中使用entries实现Map的遍历:/*** 最常见也是大多数情况下用的最多的,一般在键值对都需要使用*/Map map = new HashMap();map.put(... -
map for循环_第十五节 Map 和 WeakMap
2020-12-03 06:46:201.什么是 Map类似于一个 json,但 json 的键(key)只能是字符串;Map 的键(key)可以是任意类型。2.map 的用法语法格式:let map=new Map();map.set(key,value);----设置一个值<script> 用法:map.set(key,... -
map for循环_Map最佳实践什么时候适合使用 Map 而不是 Object
2020-12-04 01:13:42首先我们先有请「Map」简单介绍下自己「Map」映射是一种经典的数据结构类型,其中数据以 「key/value」 的键值对形式存在MapObject默认值默认不包含任何值,只包含显式插入的键一个 Object 有一个原型,原型上的键名... -
map for循环_Java_foundations_1 如何遍历Map
2020-12-02 14:07:45Java_foundations_1遍历Map首先先整一个 Map 出来private 1.只遍历 Map 的 Key@Test 2. 只遍历 Map 的 Value@Test 3. 使用 forEach 遍历 Key&Value@Test 4. 使用 Iterator 遍历 Key&Value@Test 5. 流式... -
java map for循环遍历_(转载)Java中如何遍历Map对象的4种方法
2021-02-28 06:05:43在Java中如何遍历Map对象How to Iterate ...既然java中的所有map都实现了Map接口,以下方法适用于任何map实现(HashMap, TreeMap, LinkedHashMap, Hashtable, 等等)方法一 在for-each循环中使用entries来遍历这是最常... -
map for循环_阿里面试问我hashMap的循环姿势有哪几种?
2020-12-02 00:49:41这种数据类型一般都会有增删查的方法,今天我们就来看看它的循环方法以前写过一篇关于ArrayList的循环效率问题《ArrayList哪种遍历效率最好,你真的弄明白了吗?》,感兴趣的同学可以去看看。hashMap 有常见的六七种... -
java for循环中map_Java用For循环Map
2021-03-10 01:44:32进入 根据JDK的新特性,用For循环Map,例如循环Map的Key java 代码 for(String dataKey : paraMap.keySet()) { System.out.println(dataKey ); } 这里要注意的是,paraMap是怎么样定义的,如果是简单的Map para欢迎进入... -
java for循环 map_Java用for循环Map详细解析
2021-03-17 13:15:14据JDK5的新特性,用For循环Map,例如循环Map的Key复制代码 代码如下:for(String dataKey : paraMap.keySet()) {System.out.println(dataKey );}注意的是,paraMap 是怎么样定义的,如果是简单的Map paraMap = new ... -
java for循环map赋值_Java for循环Map集合优化实现解析
2021-03-08 00:32:44这篇文章主要介绍了Java for循环Map集合优化实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下在《for循环实战性能优化》中提出了五种提升for循环性能的... -
循环map_map和for循环性能测试
2021-01-12 04:45:37之前在某个资料上看的,于是轻信...我们分别使用map函数、列表推导式、for循环傻瓜式三种方式进行处理。并计算出每一种方式执行100次的总耗时。实验环境:window10python2.7pycharm代码如下: def xunhuan(x): re... -
java for循环中map_Java中用for循环取Map
2021-03-10 01:44:29根据JDK5的新特性,Java中用for循环取Map,例如循环Map的Keyview sourceprint?1 for(String dataKey : paraMap.keySet()) {2 System.out.println(dataKey );3 }注意的是,paraMap 是怎么样定义的,如果是简单的Map ... -
使用map优化for循环
2019-11-28 11:19:09使用map优化for循环 之前做的一个东西是点击一键升级按钮,修改后台返回的json数据里面某个对应的key:value值,没有优化钱使用了for循环完成,优化后使用map完成,因为for循环随着json数据的多少循环的次数不断增加... -
for循环map
2019-12-01 21:06:23Map<String, Object> printTypeAndModel = (Map<String, Object>)transObj.get("printTypeAndModel...for(Map.Entry<String, Object> oneMap : printTypeAndModel.entrySet()) { String key = o... -
map函数改造for循环
2018-05-02 09:58:24for循环函数 map函数 -
python map比for循环快在哪
2020-09-24 10:27:35主要介绍了python 为什么map比for循环快,帮助大家更好的理解和使用python,感兴趣的朋友可以了解下 -
pythonfor循环在哪里_python map比for循环快在哪
2020-11-30 04:26:54如果不需要结果,直接使用for循环, 列表解析可以备选;除了追求代码优雅和特定规定情境,不建议使用map如果不需要返回结果这里有三个process, 每个任务将通过增加循环提高时间复杂度def process1(val, type=None):chr...