专栏首页鸿的学习笔记Python和Scala的集合和映射

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),作者:鸿

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

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

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 一条SQL生命历程

    1.一条SQL的诞生首先需要通过某种方式传递给数据库。数据库会有一个客户端用来与外界交流,而作为提交SQL的一方,可以通过ODBC或者是JDBC协议直接将SQL...

    哒呵呵
  • Python和Scala的定义变量

    每一门的编程语言背后都代表着某一种特别的哲学,由这一哲学进而设计出属于这门程序语言的语法,Python和Scala也不例外。我们从变量的定义去一窥Python和...

    哒呵呵
  • Streaming SQL基础

    基于 Stream & Table relativity,《Streaming Systems》将 declarative 的编程方式往前推进到数据系统中最常用...

    哒呵呵
  • 中科院自动化所余山:对大脑的未知,并不阻碍借鉴大脑,成就智能

    近年来,人工智能在经历过一波由深度学习带来的火爆之后,已然进入深水区;如何通向强人工智能,逐渐成为智能研究的各界人士共同关注的中心话题。

    AI科技评论
  • 腾讯WeTest&TesterHome 首次联合举办 Workshop-压测篇(上海)

    ? WeTest 导读 腾讯官方的一站式品质开放平台「腾讯WeTest」携手知名测试社区「 TesterHome 」,将腾讯沉淀十余年的品质管理经验凝聚而成,...

    WeTest质量开放平台团队
  • 思考,撸一段 SQL ? 还是写一段代码?

    以下都为个人思考总结所得,只作为抛砖引玉之说,一定会有不同意见,如果你有不同看法,欢迎拍砖。

    芋道源码
  • Steam高赞游戏入门机器学习!不写代码,人人可玩,又能吸猫,汉化版已推出

    这一游戏,名为《while True: learn()》 是个解谜/模拟类游戏,涵盖了机器学习、神经网络、大数据、人工智能的丰富知识点和实用方法。

    量子位
  • Ambari on Docker

    1.从GitHub上下载ambari文件到本地,https://github.com/sequenceiq/docker-ambari

    黑白格
  • 【GPLT】L1-029 是不是太胖了

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    喜欢ctrl的cxk
  • LeetCode143|数对和

    好久没有写类似的题解了,这题基于数组排序+双指针的思想进行解决,目前自己正在慢慢把已经做过的内容进行输出,其实也算是一种对往日题解的回顾吧,目前已输出一百多道题...

    码农王同学

扫码关注云+社区

领取腾讯云代金券