内涵列表 intensional list
Posted 牧羊龟
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了内涵列表 intensional list相关的知识,希望对你有一定的参考价值。
内涵列表
如下
[x * 2 | x <- [1..10]]
[2,4,6,8,10,12,14,16,18,20]
假设现在只想要 x * 2 大于等于12的元素,需要添加谓词,如下
[x * 2 | x <- [1..10], x * 2 >= 12]
[12,14,16,18,20]
使用谓词从list中删除元素也称为filtering过滤
假设现在将列表中大于10的奇数替换为"BANG",小于10的奇数替换为"BOOM",如果不是奇数则过滤掉,如下
boomBangs xs = [if x > 10 then "BANG" else "BOOM" | x <- xs, odd x]
如果传递的是奇数,odd函数返回True;如果传递的是偶数,则返回False
只有当所有谓词都求值为True时,元素才包含在list中
boomBangs [7..13]
["BOOM", "BOOM", "BANG", "BANG"]
不仅可以在一个内涵列表中有多个谓词(一个元素必须满足列表中包含的所有谓词),而且还可以从多个list中提取元素,生成这些list的所有可能组合,如下
[x * y | x <- [2,5,10], y <- [8,10,11]]
一个内涵列表从两个长度为3的list中提取元素,只要不过滤它们,它的长度将为9个元素
[16,20,22,40,50,55,80,100,110]
下划线_
下划线意味着不关心要从list中提取什么,所以不写一个永远不会使用的变量名,而是简单地写_,如下
length\' xs = sum [1 | _ <- xs]
处理字符串
由于字符串是list,所以可以使用内涵列表来处理和生成字符串
一个接受字符串并删除除大写字母以外的所有内容的函数,如下
removeNoUpper xs = [x | x <- xs, x `elem` [\'A\'..\'Z\']]
内嵌内涵列表
如果使用嵌套的list,则可以创建嵌套的内涵列表
xxs = [[1, 3, 5, 2, 3, 1, 2, 4, 5], [1, 2, 3, 4, 5, 6, 7, 8, 9], [1, 2, 4, 2, 1, 6, 3, 1, 3, 2, 3, 6]]
一个接受嵌套列表并删除奇数的函数,如下
removeOdd xxs = [[x | x <- xs, even x] | xs <-xxs]
如果传递的是偶数,even函数会返回True;如果传递的是奇数,则返回False
推导或内涵
指以紧凑的方式对列表,元组,字典等序列或一序列的元素进行处理,处理的结果仍然放到一个列表,字典等序列之中的语法形式:
典型列表推导形式:
[<i 相关表达式> for i in aiterator]
aiterator是指一个可遍历的对象,比如:列表,元组,也可以是range()函数。
其语义是:用循环变量i去遍历aiterator,并且将i相关表达式的值放入一个列表中。
每当对列表,元组,字典序列中的元素进行处理时,可以用推导来完成。可以降低程序的复杂性。使程序清晰易懂,缩短程序的长度。
比如获得1-10的平方数存入列表之中,使用列表只需一行代码。如下:
square=[i**i for i in range(1,11)]
如果不用推导,用for语句代码:
square=[]
for i in range(1,11)
square.append(i**i)
字典实现推导语法如下:
{key:value for key,value in aiterator}
key=[‘name‘,‘age‘,‘xingbie‘]
values=[‘lhl‘,‘18‘,‘nan‘]
adct={k:v for k,v in zip(key,values)} #字典推导中使用了并行迭代zip
结果:{‘name‘:‘lhl‘,‘age‘:‘18‘,‘xingbie‘:‘nan‘}
列表推导和字典推导不仅可以对遍历的元素进行全部处理,还可以使用if语句实现由选择性的处理遍历序列中的元素,格式如下:
[<i 相关表达式> for i in aiterator if <条件>]
{k:v for k,v in aiterate if <条件>}
如果获得1-10中所有书的平方,且平方值为偶数的一个列表,代码如下:
square=[i**i for i in range(1,11) if i**i %2==1]
对于字典推导式也可以使用if来进行部分元素的处理
如果在推导式中的求值表达式或条件表达式中应用函数,则可以构造更加复杂的推导式来实现对序列中的数据进行批量的处理(这也常被称为声明式编程)
以上是关于内涵列表 intensional list的主要内容,如果未能解决你的问题,请参考以下文章