Python和Scala的集合和映射

在入门系列的最后,让我们来看看基于hash表的两种常见的数据结构,集合和映射。在Scala里的集合和映射,这两种数据结构都有可变和不可变的两种版本,区别仅仅在于类的继承关系。而Python的集合也有可变和不可变两种,内置的字典则是只有一种,但是在types模块里有基于字典的MappingProxyType的不可变的只读视图。

集合

先从集合说起吧,集合的意义和数学上的集合论的集合是一样的,里面的值不存在重复,有着集合的交并集的操作。

1.集合的构造 Scala

scala> var set0 = Set(1,2,3,4,4)
set0: scala.collection.immutable.Set[Int] = Set(1, 2, 3, 4)

Python

set0 = {1,2,3,4,4}
set0
Out[9]: {1, 2, 3, 4}

从这里可以看出Scala默认的Set是不可变的集合。如果要做一个可变集,需要import。

scala> import scala.collection.mutable
import scala.collection.mutable

scala> val set1 = mutable.Set(1,2)
set1: scala.collection.mutable.Set[Int] = Set(1, 2)

而Python不需要import,它的不可变集合是内置的,使用的是frozenset。

frozenset({1,2,3,45})
Out[11]: frozenset({1, 2, 3, 45})

2.集合的求交集和并集 Scala

scala> val a = Set(1,2)
a: scala.collection.immutable.Set[Int] = Set(1, 2)

scala> val b = Set(1,2,3)
b: scala.collection.immutable.Set[Int] = Set(1, 2, 3)

scala> a|b
res2: scala.collection.immutable.Set[Int] = Set(1, 2, 3)

scala> a&b
res3: scala.collection.immutable.Set[Int] = Set(1, 2)

Python

a = {1,2}

b = {1,2,3}

a|b
Out[15]: {1, 2, 3}

a&b
Out[16]: {1, 2}

3.增添元素 Scala

scala> var set0 = Set(1,2,3,4,4)
set0: scala.collection.immutable.Set[Int] = Set(1, 2, 3, 4)

scala> set0 += 5

scala> set0
res4: scala.collection.immutable.Set[Int] = Set(5, 1, 2, 3, 4)

Python

set0 = {1,2,3,4,4}
set0.add(5)
set0
Out[19]: {1, 2, 3, 4, 5}

这里的set0实际上是重新赋值了,而不是原地添加,所以我们会使用var定义变量,而Python的集合是原地添加元素。

4.判断某个元素是否存在 Scala

scala> set0.contains(1)
res7: Boolean = true

Python

1 in set0
Out[20]: True

映射

Map这个实际上有很多的别名,在Scala里称为映射,而在Python则被称为字典,本质都是一样的基于Hash表的数据结构,能够快速的查找某个值。

1.构造 Scala

scala> val map1 = Map(1 -> "hello",2 -> "world")
map1: scala.collection.Map[Int,String] = Map(1 -> hello, 2 -> world)

scala> import scala.collection.mutable
import scala.collection.mutable

scala> val map0 = mutable.Map[Int, String](1 -> "hello",2 -> "world")
map0: scala.collection.mutable.Map[Int,String] = Map(2 -> world, 1 -> hello)

Python

dict0 = {1:"hello",2:"world"}
import types
dict1 = types.MappingProxyType(dict0)

我们可以注意到Scala的Map使用->作为分隔符,而Python使用了:(八卦下:这个符号通过Python,影响了js,进而成为了json的分隔符),Scala的默认版本是不可变的映射,而不是可变的映射,这也是Scala设计者对于函数式的不可变的推崇的体现吧

2.增添元素 初始化为空值

scala> val map0 = mutable.Map[Int, String]()
map0: scala.collection.mutable.Map[Int,String] = Map()

scala> map0 += (1 -> "hello")
res12: map0.type = Map(1 -> hello)

scala> map0 += (2 -> "world")
res13: map0.type = Map(2 -> world, 1 -> hello)

scala> map0
res15: scala.collection.mutable.Map[Int,String] = Map(2 -> world, 1 -> hello)

Python

dict0 = {}

dict0[1] = "hello"

dict0[2] = "world"

好了,入门系列就到此为止了,下一章我们就要深入类和对象了,开始真正的编程之旅了。

原文发布于微信公众号 - 鸿的学习笔记(shujuxuexizhilu)

原文发表时间:2018-03-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏null的专栏

python基础知识——内置数据结构(集合)

python中的set是指一系列无序元素的集合,其中的元素都是相异的,常见的操作包括集合的并集,交集和补集等操作。 1、set的创建 格式 set_name =...

3467
来自专栏Java技术分享圈

杨老师课堂之ArrayList集合解析

​ 在前面我们学习了数组,数组可以保存多个元素,但在某些情况下无法确定到底要保存多少个元素,此时数组将不再适用,因为数组的长度不可变。例如,要保存一...

733
来自专栏闻道于事

Java之集合初探(一)

一、集合概述、区别 集合是一种容器,数组也是一种容器 在Java编程中,装各种各样的对象(引用类型)的叫做容器。 为什么出现集合类? 面向对象语言对事物的体现都...

2557
来自专栏LanceToBigData

JavaSE(八)之Collection总结

  前面几篇把集合中的知识大概都详细的说了一遍,但是我觉得还是要总结一下,这样的话,可以更好的理解集合。 一、Collection接口 首先我们要一张图来说明:...

2436
来自专栏和蔼的张星的图像处理专栏

76. 最长上升子序列动态规划+二分查找

给定一个整数序列,找到最长上升子序列(LIS),返回LIS的长度。 说明 最长上升子序列的定义: 最长上升子序列问题是在一个无序的给定序列中找到一个尽可能...

6181
来自专栏用户3030674的专栏

java集合框架(hashSet自定义元素是否相同,重写hashCode和equals方法)

/*HashSet 基本操作 * --set:元素是无序的,存入和取出顺序不一致,元素不可以重复 * (通过哈希值来判断是否是同一个对象) * ---...

1612
来自专栏青玉伏案

JavaSE高级之集合类

​下面的内容是对java中的集合类进行的总结,过段时间会分享java的网路编程,多线程等内容,欢迎批评指正。 1.Java中的集合是用来存放对象的,即集合是对象...

2419
来自专栏LinkedBear的个人空间

唠唠SE的集合-02——Iterator迭代器

迭代时如果没有先执行next()则会抛出IllegalStateException,这就意味着必须要先检查是否还有下一个可以被迭代的元素,才能往外取。

1033
来自专栏一个会写诗的程序员的博客

第7章 集合类第7章 集合类

在 Java 类库中有一套相当完整的容器集合类来持有对象。Kotlin没有去重复造轮子(Scala则是自己实现了一套集合类框架),而是在Java 类库的基础上进...

812
来自专栏郭耀华‘s Blog

剑指offer第五天

28.数组中出现次数超过一半的数字 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2...

2755

扫码关注云+社区

领取腾讯云代金券