字典:散列表、散列字典、关键字列表、集合与结构体

字典

  散列表和散列字典都实现了Dict的行为。Keyword模块也基本实现了,不同之处在于它支持重复键。

  Eunm.into可以将一种类型的收集映射转化成另一种。

defmodule Sum do
    def values(dict) do
        dict |> Dict.values |> Enum.sum
    end
end

hd = [ one: 1, two: 2, three: 3 ] |> Enum.into HashDict.new
IO.puts Sum.values(hd)      #=>6

  Dict相关API

kw_list = [name: "Dave", likes: "Programming", where: "Dallas"]
hashdict = Enum.into kw_list, HashDixt.new
map = Enum.into kw_list, Map.new

kw_list[:name]        #=>"Dave"
hashdict[:likes]        #=>"Programming"
map[:where]        #=>"Dallas"

hashdict = Dict.drop(hashdict, [:where, :likes])        #=>HashDict<[name: "Dave"]>
hashdict = Dict.put(hashdict, :also_likes, "Ruby)        #=>HashDict<[name: "Dave", also_likes: "Ruby"]>
combo = Dict.merge(map, hashdict)        #合并=>%{also_likes: "Ruby", likes: "Programming", name: "Dave", where: "Dallas"}

  例子:

people = [
    %{ name: "Grumpy, height: 1.24 },
    %{ name: "Dave", height: 1.88 },
    %{ name: "Dopey", height: 1.32 },
    %{ name: "Shaquille", height: 2.16 },
    %{ name: "Sneezy", height: 1.28 }
    ]
for person = %{ height: height } <- people,     #将列表中的散列表绑定到person ,并将高度值绑定到height
    height > 1.5,            #筛选出高度高于1.5的
    do: IO.inspect person    

  例子2:

def book(%{name: name, height: height})
when height > 1.9 do
    ...
end

def book(%{name: name, height: height})
when height < 1.3 do
    ...
end

def book(person) do
    ...
end

people |> Enum.each(&HotelRoom.book/1)

更新散列表

  new_map = %{ old_map | key => value, ...},会创建一个新的散列表,它是旧散列表的拷贝,但是管道运算符右边与键所对应的值会被更新。

m = %{ a: 1, b: 2, c: 3 }
m1 = %{ m | b: "two", c: "three" }        #%{ a: 1, b: "two, c: "three" }
    #要增加新的键值需要使用Dict.put_new/3函数

结构体

  结构体就是模块,它封装了一个有限形式的散列表。有限是因为键必须为原子,并且这些散列表不具备Dict和Access特性。使用defstruct来定义散列表的性质。

  结构体的使用就相当于是散列表一样,只不过结构体有默认参数。

defmodule Subscriber do
    defstruct name: "", paid: false, over_18: true
end

s1 = %Subscriber{}        #=>%Subscriber{name: "", over_18: true, paid: false }
s2 = %Subscriber{name: "Mary", paid: true}        #=>%Subscriber{name: "Mary", over_18: true, paid: true }

匹配
s2.name            #通过点标记访问,键必须为原子,符合结构体的特性
%Subscriber{name: a_name} = s3
a_name            #=>"Mary"

更新s3 = %Subscriber{ s2 | name: "Marie" }

  例子:

defmodule Attendee do
    defstruct name: "", paid: false, over_18: true

    def may_attend_after_party(attendee = %Attendee{}) do    #函数参数使用 %Attendee{} 接受结构体
        attendee.paid && attendee.over_18
    end

    def print_vip_badge(%Attendee{name: name}) when name != "" do
        IO.puts "Very cheap badge for #{name}"
    end

    def print_vip_bage(%Attendee{}) fo
        raise "missing name for badge"
    end
end

  

  散列表实现了Access协议,所以可以使用 [] 访问。我们可以给结构体添加这个功能。

defmodule Attendee do
    @derive Access
    defstruct name: "", over_18: false
end

a = %Attendee{name: "Sally", over_18: true}
a[:name]          #=> "Sally

嵌套字典结构

  字典类型可以让键和值相关联,这些值本身也可以是字典类型。

defmodule Customer do
    defstruct name: "", company: ""
end

defmodule BugReport do
    defstruct owner: %{}, details: "", serverity: 1
end

report = %BugReport{owner: %Customer{name: "Dave", company: "Pragmatic"}, detail: "broken"}

#访问
report.owner.company

#更新/修改
report = %BugReport{ report | owner: %Customer{ report.owner | company: "PragProg" }}

#put_in可以设置嵌套结构里面的值
put_in(report.owner.company, "PargProg")

#update_in可以让我们在结构体上的某一个值上执行一个函数
update_in(report.owner.name, &("Mr. " <> &1))    #连接 "Mr. "和name

原文地址:https://www.cnblogs.com/lr1402585172/p/11498408.html

时间: 2024-08-04 01:52:34

字典:散列表、散列字典、关键字列表、集合与结构体的相关文章

win32 sdk列表视图控件两个重要的结构体

列表视图控件是一种非常常用的控件,在需要以报表形式显示数据时,列表控件通常是最好的选择,许多专用的数据报表控件,也是在它的基础上派生而来.与树视图类似,列表控件可以由多个子项目组成,可以设置为Icon(大图标).SmallIcon(小图标).List(列表)或Report(报表). 一.列表视图控件有两个重要的数据结构LVCOLUMN和LVITEM.LVCOLUMN用于定义报表方式下的“列”的结构:LVITEM用于定义“项”的结构.这两个结构的定义及说明如下: typedef struct _L

[转载] Python 列表(list)、字典(dict)、字符串(string)常用基本操作小结

创建列表 sample_list = ['a',1,('a','b')] Python 列表操作 sample_list = ['a','b',0,1,3] 得到列表中的某一个值 value_start = sample_list[0] end_value = sample_list[-1] 删除列表的第一个值 del sample_list[0] 在列表中插入一个值 sample_list[0:0] = ['sample value'] 得到列表的长度 list_length = len(sa

Python 列表(list)、字典(dict)、字符串(string)常用基本操作小结

[python] view plaincopy 创建列表 sample_list = ['a',1,('a','b')] Python 列表操作 sample_list = ['a','b',0,1,3] 得到列表中的某一个值 value_start = sample_list[0] end_value = sample_list[-1] 删除列表的第一个值 del sample_list[0] 在列表中插入一个值 sample_list[0:0] = ['sample value'] 得到列表

python 高级数据类型(列表 元祖 字典 字符串)

高级变量类型 目标 列表 元组 字典 字符串 公共方法 变量高级 知识点回顾 Python 中数据类型可以分为 数字型 和 非数字型 数字型 整型 (int) 浮点型(float) 布尔型(bool) 真 True 非 0 数 -- 非零即真 假 False 0 复数型 (complex) 主要用于科学计算,例如:平面场问题.波动问题.电感电容等问题 非数字型 字符串 列表 元组 字典 在 Python 中,所有 非数字型变量 都支持以下特点: 都是一个 序列 sequence,也可以理解为 容

列表解析、字典解析

列表解析 创建一个整数列表 number_list = [number for number in range(1,6)] number_list [1, 2, 3, 4, 5] 使用条件表达式 number_list = [number-1 for number in range(1,6)] number_list [0, 1, 2, 3, 4] 创建一个1-5之间的偶数列表 number_list = [number for number in range(1,6) if number % 

Python成长笔记 - 基础篇 (三)python列表元组、字典、集合

本节内容 列表.元组操作 字符串操作 字典操作 集合操作 文件操作 字符编码与转码   一.列表和元组的操作 列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作 定义列表 names = ["Wang","HouZi1","NiuNiu","ZhouYi","HouZi2",[1,2]] 可以通过列表角标的方式去获得list中的值 print(names)print(nam

列表中放置字典的应用:名片管理系统

在宿舍宅了一天没出门,感觉自己快要霉掉了. 明天一定要出去走走才行啊,身体是自己的. 今天总算是半抄半写的把这个名片管理系统做完了,问题依然很多,比如我竟然忘了条件里的比较要用==而不是=--低级错误 手感不够,说起来手感这东西也只有长时间持之以恒地写代码才能培养出来了,好多东西不熟悉. 算了,说说今天这个系统好了,名片管理系统,用字典保存一个人的所有信息,用列表保存字典,再用列表的相应命令实现名片系统的增删改查,也即列表中的字典的增删改查.代码如下: #1.程序说明print('$'*50)p

python学习day-3 列表 元祖 字典

一.列表list a.基础 1. li = [1, 12, 9, "age", ["石振文", ["19", 10], "庞麦郎"], "alex", True] 中括号括起来:,分割每个元素:列表中的元素可以是数字,字符串,列表,布尔值......:列表可以嵌套 (他就是个集合,内部放置任何东西) 2.可以进行索引,切片取值 li = [1, 12, 9, "age", ["

python字符串删除,列表删除以及字典删除的总结

一:字符串删除  1,字符串本身是不可变的,一个字符串定义以后,对他本身是不能做任何操作的,所以的增删改都是对原字符串拷贝的副本的操作,原来的字符串还是原来的字符串,它本身并没 有变 2,字符串本身是不能修改的,但是可以通过其他方法来达到一个看似修改的效果,比如,切片+拼接   replace()替换,strip(), rstrip(),lstrip()去掉两端的字符 二:列表删除 1.pop(index) 2.remove(元素) 3.del 切片 4.clear()清空列表 三:字典删除 1