Task05 字典 字串

2021-10-12 08:41:32 字數 3307 閱讀 9068

map 是一種較為特殊的資料結構,在任何一種程式語言中都可以看見它的身影,它是一種鍵值對結構,通過給定的 key 可以快速獲得對應的 value

4.1.1 如何定義字典

var m1 map[string]int

m2 := make(map[int]inte***ce{}, 100)

m3 := map[string]string

在定義字典時,不需要為其指定容量,因為 map 是可以動態增長的,但是在可以預知 map 容量的情況下為了提高程式的效率也最好提前標明程式的容量。需要注意的是,不能使用不能比較的元素作為額哦字典的 key,例如陣列、切片等。而 value 可以是任意型別的,如果使用 inte***ce{} 作為 value 型別,那麼就可以接受各種型別的值,只不過在具體使用的時候需要使用型別斷言來判斷型別

4.1.2 字典操作

向字典中放入元素也非常簡單

m3["key1"] = "v1"

m3["key2"] = "v2"

m3["key3"] = "v3"

你可以動手試一下,如果插入的兩個元素 key 相同會發生什麼?

與陣列和切片一樣,我們可以使用 len 來獲取字典的長度

len(m3)
在有些情況下,我們不能確定鍵值對是否存在,或者當前 value 儲存的是否就是空值,go 語言中我們可以通過下面這種方式很簡便的進行判斷

if value, ok := m3["name"]; ok
上面這段**的作用就是如果當前字典中存在 key 為 name 的字串取出對應的 value,並返回 true,否則返回 false

對於乙個已經存在的字典,我們如何對其進行遍歷呢?可以使用下面這種方式:

for key, value := range m3
如果存在於字典中的值已經沒有作用了,我們想將其刪除該怎麼辦呢?可以使用 go 的內建函式 delete 來實現

delete(m3, "key1")
除了上面的一些簡單操作,我們還可以宣告值型別為切片的字典以及字典型別的切片等等,你可以動手試試看。

不僅如此我們還可以將函式作為值型別存入到字典中

func main()

m["multi"] = func(a, b int) int

fmt.println(m["add"](3, 2))

fmt.println(m["multi"](3, 2))

}

字串是一種值型別,在建立字串之後其值是不可變的,也就是說下面這樣操作是不允許的。

s := "hello"

s[0] = "t"

編譯器會提示cannot assign to s[0]。在 c 語言中字串通過\0來標識字串的結束,而 go 語言中是通過長度來標識字串是否結束的

如果我們想要修改乙個字串的內容,我們可以將其轉換為位元組切片,再將其轉換為字串,但是也同樣需要重新分配記憶體

func main()
與其他資料型別一樣,也可以通過len()函式來獲取字串長度

len(s)
但是如果字串中包含中文就不能直接使用 byte 切片對其進行操作,go 語言中我們可以通過這種方式

func main()//hello 你好中國

}

在 go 語言中字串都是以 utf-8 的編碼格式進行儲存的,所以每個中文佔三個位元組加上 hello 的 5 個位元組,所以長度為 17,如果我們通過utf8.runecountinstring函式獲得的包含中文的字串長度則與我們的直覺想符合。而且由於中文對於每個單獨的位元組來收是不可列印的,所以可以看到很多奇怪的輸出,但是將字串轉為 rune 切片則沒有問題

4.2.2 string 包

strings 包提供了許多操作字串的函式。在這裡你可以看到都包含哪些函式:

下面演示幾個例子:

func main()
4.2.3 strconv 包

strconv 包實現了基本資料型別與字串之間轉換。在這裡你可以看到都包含哪些函式:

下面演示幾個例子:

i, err := strconv.atoi("-42") //將字串轉為 int 型別

s := strconv.itoa(-42) //將 int 型別轉為字串

若轉換失敗則返回對應的 error 值

4.2.4 字串拼接

除了以上的操作外,字串拼接也是很常用的一種操作,在 go 語言中有多種方式可以實現字串的拼接,但是每個方式的效率並不相同,下面就對這幾種方法進行對比。

1. sprintf

const numbers = 100

func benchmarksprintf(b *testing.b)

}b.stoptimer()

}

2. + 拼接
func benchmarkstringadd(b *testing.b)

}b.stoptimer()

}

3. bytes.buffer
func benchmarkbytesbuf(b *testing.b) 

_ = buf.string()

}b.stoptimer()

}

4. strings.builder 拼接
func benchmarkstringbulider(b *testing.b) 

_ = builder.string()

}b.stoptimer()

}

5.
benchmarksprintf-8                68277         18431 ns/op

benchmarkstringbuilder-8 1302448 922 ns/op

benchmarkbytesbuf-8 884354 1264 ns/op

benchmarkstringadd-8 208486 5703 ns/op

可以看到通過strings.builder拼接字串是最高效的。

Task05 字典 集合和序列

可變型別與不可變型別 序列是以連續的整數為索引,與此不同的是,字典以 關鍵字 為索引,關鍵字可以是任意不可變型別,通常用字串或數值。字典是 python 唯一的乙個 對映型別,字串 元組 列表屬於序列型別。字典的定義 字典 是無序的 鍵 值 key value 對集合,鍵必須是互不相同的 在同乙個字...

05, 字典,集合

1.什麼是字典 字典是以key value的形式來儲存資料,用 表示.儲存的是key value 坑 字典儲存資料的時候是用的hash值來儲存.演算法不能變 python的 資料必須是不可變的 可雜湊 字典的key必須是可雜湊的 不可變 dic print dic jay 周杰倫 dic jay 麻...

街景字元編碼識別 Task05 模型整合

學習目標 模型整合 整合學習 ensemble learning 通過構建並結合多個弱學習器來綜合得到乙個強學習器的方法。機器學習領域的整合方法有bagging boosting stacking。bagging bootstrap aggregating,裝袋 bagging使用裝袋取樣來獲取資料...