首页 > 编程语言 >map(python中的字典?)

map(python中的字典?)

时间:2024-02-23 20:12:18浏览次数:27  
标签:map string python fmt value int personSalary 字典

目录

一、什么是map

  • map 是相当于python中的字典,是一群键值对的集合体,可以通过键来取值、改值、增值

  • python在3.7版本之前字典是无序的,但是在之后的版本都是有序的,即按照插入顺序排列键值对,而Go中的map是无序的

  • 不同的是,Go中所有可比较的类型 boolean,interger,float,complex,string 等,都可以作为map的key

  • 空map的零值是 nilmap之间不能使用 == 操作符判断,只能用来检查map是否为 nil

    • package main
      
      import (
          "fmt"
      )
      
      func main() {  
          var personSalary map[string]int  // 同 personSalary := make(map[string]int)
          if personSalary == nil {  // 为真
              fmt.Println("map is nil. Going to make one.")
              personSalary = make(map[string]int)
          }
      }
      

二、map的创建

  • 两种创建方式

1. 直接创建

1. 声明一个map类型,此时该map 等于 nil ,只要初始化了,就不等于 nil
var map名 map[key类型]值类型

2. 定义一个map,并初始化,{}内元素为0个时,此时map也不等于 nil
var map名 = map[key类型]值类型{key1:val1,key2:val2 等等}  // {} 内键值对为0到无数个
map名 := map[key类型]值类型{key1:val1,key2:val2 等等}  // {} 内键值对为0到无数个

// 示例
personSalary := make(map[string]int)  // 同 var personSalary = map[string]int{} ,同 personSalary := map[string]int{}
personSalary := map[string]int {
        "steve": 12000,
        "jamie": 15000,
    }

2. 通过make函数创建

var map名 = make(map[key类型]值类型)
map名 := make(map[key类型]值类型)

// 示例:
var personSalary = make(map[string]int)
personSalary := make(map[string]int)

三、map的取值、改值、增值

  • 取值的语法和python的字典取值是一样的,即 map名[key]
  • 当取值时,map中不存在这个key,程序不会报错,而是返回一个该值类型的空值

1. 取值、改值、增值实例

package main

import (  
    "fmt"
)

func main() {
    personSalary := map[string]int{
        "steve": 12000,
        "jamie": 15000,
    }
    personSalary["mike"] = 9000  // 新增 mike:9000 的键值对
    personSalary["steve"] = 11000  // 修改 steve的值为11000
    employee := "jamie"
    fmt.Println(personSalary[employee])  // 15000
    fmt.Println(personSalary["steve"])  // 11000
    fmt.Println(personSalary["joe"])  // 0
}

2. 判断key是否存在

语法:

value, res := map名[key]

// 若key存在,则 res值为 true,此时value为key对应的值
// 若key不存在,则 res值为 false,此时value为该map值类型的空值

四、for range 遍历map

  • for range 遍历 map 时,返回的是key和value
package main

import (
    "fmt"
)

func main() {
    personSalary := map[string]int{
        "steve": 12000,
        "jamie": 15000,
    }
    personSalary["mike"] = 9000
    fmt.Println("All items of a map")
    for key, value := range personSalary {
        fmt.Printf("personSalary[%s] = %d\n", key, value)
    }
}

/*
输出结果

All items of a map
personSalary[mike] = 9000
personSalary[steve] = 12000
personSalary[jamie] = 15000
*/

五、删除 map 中的元素

  • 使用 delete(map,key)方法进行删除,该方法没有返回值
  • 删除一个不存在的key,不会报错
package main

import (  
    "fmt"
)

func main() {  
    personSalary := map[string]int{
        "steve": 12000,
        "jamie": 15000,
    }
    personSalary["mike"] = 9000
    fmt.Println("map before deletion", personSalary)
    delete(personSalary, "steve")
    fmt.Println("map after deletion", personSalary)
    delete(personSalary, "111")  // 删除一个不存在的key,不会报错
	fmt.Println("map after deletion", personSalary)
}

/*
打印结果
map before deletion map[jamie:15000 mike:9000 steve:12000]
map after deletion map[jamie:15000 mike:9000]
map after deletion map[jamie:15000 mike:9000]
*/

六、获取 map 的长度

  • 使用 len 函数
package main

import (
    "fmt"
)

func main() {
    personSalary := map[string]int{
        "steve": 12000,
        "jamie": 15000,
    }
    personSalary["mike"] = 9000
    fmt.Println("length is", len(personSalary))  // length is 3

}

七、map 是引用类型

  • 和切片类似,map 也是引用类型。当 map 被赋值为一个新变量的时候,它们指向同一个内部数据结构。因此,改变其中一个变量,就会影响到另一变量
  • map 作为函数参数传递时也会发生同样的情况。函数中对 map 的任何修改,对于外部的调用都是可见的
package main

import (
    "fmt"
)

func main() {
    personSalary := map[string]int{
        "steve": 12000,
        "jamie": 15000,
    }
    personSalary["mike"] = 9000
    fmt.Println("Original person salary", personSalary)
    newPersonSalary := personSalary  // 此时,newPersonSalary 和 personSalary 指向的都是同一个map
    newPersonSalary["mike"] = 18000
    fmt.Println("Person salary changed", personSalary)

}

/*
Original person salary map[steve:12000 jamie:15000 mike:9000]
Person salary changed map[steve:12000 jamie:15000 mike:18000]
*/

八、多类型value的 map

  • map 的value部分可以是任意类型,数字、字符串、数组、切片、map

1. 复杂 map 的定义

1. 定义一个复杂map

var a = make(map[int]map[int]string)  // 定义一个value也为map的map
var b = make(map[string]map[string]string)  // 定义一个value也为map的map
var c = make(map[int][3]string)  // 定义一个value为数组的map
var d = make(map[string][]int)  // 定义一个value为切片的map


a := make(map[int]map[int]string)  // 定义一个value也为map的map
b := make(map[string]map[string]string)  // 定义一个value也为map的map
c := make(map[int][3]string)  // 定义一个value为数组的map
d := make(map[string][]int)  // 定义一个value为切片的map


// ************上面这些定义只是定义了第一层value为其他数据类型,还可以定义第二层,第三层等等************
// ************ 因为map的value类型是定义时就确定好的,所以,不能像python一样,中途通过键增值其他的数据类型,因此只能事先定义好要用的那一层的value的类型

2. 复杂 map 的赋值

  • 分为 内部的map、切片 赋值 和 数组赋值两种情况

(1)内部的map、切片 赋值

package main

import (
    "fmt"
)

func main() {
	a := make(map[int]map[int]string)  // 初始化一个第一层value为map的 map
	var b = make(map[string]map[string]string)  // 初始化一个第一层value为map的 map
	var c = make(map[int][3]string)  // 初始化一个第一层value为数组的map
	var d = make(map[string][]int)  // 初始化一个第一层value为切片的map

	fmt.Println(a) // map[]
	fmt.Println(b) // map[]
	fmt.Println(c) // map[]
	fmt.Println(d) // map[]

	if a == nil {
		println("111")  // 未打印
	} else {
		println("222")  // 222
	}

	if a[1] == nil {
		println("333")  // 333
	}
	
    // a[1][2] = "sss"
    /*
	不能直接进行赋值操作,会报错: panic: assignment to entry in nil map ,
    因为此时a[1]对应的值相当于声明了一个map类型,未初始化,所以它的值为 nil,nil是不能进行map的增值操作的,
    必须先将 a[1] 对应的map 初始化,
    如下面的 a[1] = map[int]string{} 
    
    d 的value是切片,和上面 a 同理,也要先初始化,再进行赋值
    
    */
    
	// fmt.Println("444", a)
	a[1] = map[int]string{}
	a[1][2] = "sss"
	fmt.Println("555", a)  // 555 map[1:map[2:sss]]

}

(2)内部数组的赋值

  • 待更

标签:map,string,python,fmt,value,int,personSalary,字典
From: https://www.cnblogs.com/Mcoming/p/18030290

相关文章

  • python 加密 变量 (可用于深度学习模型加密)
    需求:深度学习基于pytorch,模型需要加密。查看到网上有使用cryptography加密的方法,如https://blog.csdn.net/weixin_43508499/article/details/124390983,总体思路是调用torch的save函数将模型保存为io.BytesIO,然后使用cryptography将保存为io.BytesIO的字节进行加密,解密......
  • 盘点一个Python自动化办公Excel数据处理的需求
    大家好,我是Python进阶者。一、前言前几天在Python白银交流群【干锅牛蛙】问了一个Python处理Excel数据的问题。问题如下:有两个问题哈:1、表头有合并单元格识别不出来,如何处理类似下图2、遇到单元格有公式自动识别成了0,如何处理,保留计算后的值,类似下图附上他自己的代码如下:目......
  • Kubernetes ConfigMap挂载导致容器目录中的文件被覆盖
    容器的/apps/pero/src/resources/文件夹下有多个文件,如果挂载一个文件进去,会把其他文件都覆盖掉,只剩挂载的文件按如下修改即可volumeMounts:-name:pero-configmountPath:/apps/pero/src/resources/application.propertiessubPath:a......
  • 基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的快递包裹检测系统(Python+PySide6界面+训练代码)
    摘要:本文介绍了一种基于深度学习的快递包裹检系统系统的代码,采用最先进的YOLOv8算法并对比YOLOv7、YOLOv6、YOLOv5等算法的结果·,能够准确识别图像、视频、实时视频流以及批量文件中的快递包裹。文章详细解释了YOLOv8算法的原理,并提供了相应的Python实现代码、训练数据集,以及基于P......
  • python基础学习8-网络协议、进程与线程
    UDP协议用户数据包协议socketbind()sendall()recvfrom()sendto()close()TCP服务器端流程:使用socket类创建一个套接字对象使用bind((ip,port))方法绑定ip地址和端口号使用listen()方法开始TCP监听使用accept()方法等待客户端的连接使用recv()/send()方法接受发送......
  • 基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的智能监考系统(Python+PySide6界面+训练代码)
    摘要:本文介绍了一种基于深度学习的智能监考系统系统的代码,采用最先进的YOLOv8算法并对比YOLOv7、YOLOv6、YOLOv5等算法的结果·,能够准确检测图像、视频、实时视频流以及批量文件中的目标。文章详细解释了YOLOv8算法的原理,并提供了相应的Python实现代码、训练数据集,以及基于PySide6......
  • grpc python 实践
    目录前言项目结构依赖安装简单Demo接口定义编译proto服务端的实现客户端的实现进阶Demo接口定义服务端的实现客户端的实现使用HTTP作为中介服务端的实现客户端的实现原文链接:1.使用Python实现gRPC通信前言本文主要讲述如何使用Python实现gRPC通信,并通过三个例子,由浅入深地进行......
  • MIT 6.5840 MapReduce Lab
    MapReduceMapReduce是一种编程模型,其思想是让程序员通过编写简单的Map和Reduce程序就能完成分布式系统的任务,而不需要关注分布式的具体细节。用户自定义的Map函数接受一个key/valuepair的输入值,然后产生一个中间key/valuepair值的集合。MapReduce库把所有具有相同中......
  • 【Python&GIS】Python线矢量等距离取点/线等分取点&点创建矢量面
    ​        不多说,这是之前项目需求的代码,已经是去年的了一直没来的及发,今天抽出来一丢丢的空挡发一下。主要就是利用线矢量等距离生成点矢量,或者直接将线矢量等分生成点矢量,这个需求其实极限一下就是线转点了(将距离设置小一点)。顺便将点生成矩形面的代码也给出来,这里的......
  • mybatis—mapper.xml里的多种写法举例
    mybatis—mapper.xml里的多种写法举例目录mybatis—mapper.xml里的多种写法举例向一个表里插入另一个表的一些数据并进行取舍需要查询的select后的字段如果有不少语句都一致的话可以考虑单独提出来更新删除in语句面对集合和字符串<trim>标签<choose>标签判断<when>、<other......