Python 和 Golang 中的排序操作

假设给定一个二维的整形数组 nums,元素是长度为 2 的数组,如下: [[5,4],[6,4],[6,7],[2,3]] 目前的需求是对该数组排序,要求为将每个元素的第一个数字升序排列,如果该数字相等,则将第二个数字降序排列。 即排序后 nums 如下所示: [[2,3],[5,4],[6,7],[6,4]] 二维的有点麻烦,我们先考虑怎样对一个一维数组进行排序。 比如,我们现在有这样的一个一维数组: [35, 22, 189, 33, -33, 0] 我们怎样对它进行升序排序呢? 先看一下 Python (Python 3 以上版本) 是怎样做的。 nums = [35, 22, 189, 33, -33, 0] # 第一种方式 nums.sort() # 第二种方式 nums = sorted(nums) 从两种方式的不同调用方式可以看出差异:sort() 对原数组(列表)排序,而 sorted() 会返回一个新的数组。除此之外,sort() 只能被数组调用,而 sorted() 可以对任意可迭代对象(比如元组)进行排序。 那如果要降序排序呢? nums = [35, 22, 189, 33, -33, 0] # 第一种方式 nums.sort(reverse=True) # 第二种方式 nums = sorted(nums, reverse=True) 只需要指定 reverse 参数为 True 即可。 那么 Golang 是怎样做的? package main import ( "sort" ) func main() { nums := []int{35, 22, 189, 33, -33, 0} // 升序排序 sort.Ints(nums) // 降序排序 sort.Sort(sort.Reverse(sort.IntSlice(nums))) } 从调用方式上来看,可以看出 Golang 要比 Python 麻烦一些,其中,升序排序很直观。 ...

March 27, 2022 · 3 min · 扬扬得意

对比 Go、Python 和 Rust 三种语言中字符串索引操作

字符串有很多实现细节,如果详细介绍每个细节,一篇文章的篇幅显然是不够的。 这篇文章不会面面俱到地讲述细节,而是聚焦于三种不同的语言对字符串遍历和索引的处理逻辑。 假设我们现在有这样的一个字符串 "Hello, 世界",我们首先在三种语言中做遍历和求字符串长度操作。 # Python st = "Hello, 世界" for item in st: print(item) print(len(st)) # Output: # H # e # l # l # o # , # # 世 # 界 # 9 Python 的操作逻辑符合我们直觉,"Hello, 世界" 一共有 9 个字符。 // Go package main import "fmt" func main() { st := "Hello, 世界" for _, item := range st { fmt.Println(item) } fmt.Println(len(st)) fmt.Println("-----") // 把字符串转换为字节数组 for _, item := range []byte(st) { fmt.Println(item) } } /* Output: 72 101 108 108 111 44 32 19990 30028 13 ----- 72 101 108 108 111 44 32 228 184 150 231 149 140 */ Go 这边和 Python 差距比较大,输出的不是字符而是数字,而且字符串的长度竟然是 13,这是什么情况?首先把问题放到一边,继续看 Rust 的情况。 ...

March 23, 2022 · 2 min · 扬扬得意