Racket list

Racket 是 Lisp 语言的一种方言,常用于教学。它的特点是强大的宏系统和模块化支持,以及丰富的库函数,可以很方便地编写各种复杂的程序。其中,List(列表)是 Racket 中最基础和重要的数据结构之一,我们在本文中将详细介绍。

List 基础

在 Racket 中,列表是有序的元素集合。你可以将它想象成一个链表。一个空的列表可以用 '() 表示,也可以用内建函数 empty 表示。非空的列表由一个或多个元素和一个空列表组成。

创建 List

list

我们可以用 list 函数创建一个新的列表。例如:

; 创建一个新的列表 [1, 2, 3]
(define my-list (list 1 2 3))  

你也可以用 ' 符号来创建一个列表:

; 创建一个新的列表 [1, 2, 3]
(define my-list '(1 2 3))  

make-list

Another way to make lists is using the make-list function:

> (make-list 10 'me) 
'(me me me me me me me me me me)

As you can see, make-list takes a number and a value, and makes a list that contains that value repeated that number of times.

访问 List

要访问列表的元素,我们可以使用 first 函数获取第一个元素,使用 rest 函数获取剩下的元素(返回的仍然是一个列表):

(define my-list (list 1 2 3))
; 返回 1
(first my-list)  
; 返回 (list 2 3)
(rest my-list)  

List 操作

添加元素

要在列表前添加一个元素,我们可以使用 cons 函数:

(define my-list (list 1 2 3))
; 新的列表为 [0, 1, 2, 3]
(define new-list (cons 0 my-list))  

删除元素

要删除列表的第一个元素,我们可以使用 rest 函数:

(define my-list (list 1 2 3))
; 新的列表为 [2, 3]
(define new-list (rest my-list))  

反转列表

If you need the elements in a list reversed, you can use the reverse function.

> (reverse '(1 2 3 4 5)) 
; reverse elements of a list 
'(5 4 3 2 1)

列表排序

The sort function will sort a list. You can pass in < to sort the list in ascending order:

> (sort '(1 3 6 5 7 9 2 4 8) <) 
'(1 2 3 4 5 6 7 8 9)

Or, if you pass in >, it will sort the list in descending order:

> (sort '(1 3 6 5 7 9 2 4 8) >) 
> '(9 8 7 6 5 4 3 2 1)

连接列表

要连接两个列表,我们可以使用 append 函数:

(define list1 (list 1 2 3))
(define list2 (list 4 5 6))
; 新的列表为 [1, 2, 3, 4, 5, 6]
(define new-list (append list1 list2))  

也支持多个拼接:

> (append '(1 2) '(3 4) '(5 6)) 
'(1 2 3 4 5 6)

列表长度

要获取列表的长度,我们可以使用 length 函数:

(define my-list (list 1 2 3))
; 返回 3
(length my-list)  

range

The range function will create a list of numbers given some specifications. You can pass a start value and an end value, as well as a step to increment:

> (range 0 10 2) 
'(0 2 4 6 8)

Or, if you just pass an end value, it will start at 0 with a step of 1:

> (range 10) 
'(0 1 2 3 4 5 6 7 8 9)

member

Another way to search lists is to use member, which tests whether a list contains an instance of a particular element. It returns the symbol #f if it does not, and returns the tail of the list starting with the first instance of the
matching element if it does.

> (member 7 '(9 3 5 (6 2) 5 1 4)) 
#f

> (member 5 '(9 3 5 (6 2) 5 1 4)) 
'(5 (6 2) 5 1 4)

> (member 6 '(9 3 5 (6 2) 5 1 4))
#f

Notice that in the last instance, even though 6 is a member of a sublist of the searched list, the member function still returns false. However, the following does work.

> (member '(6 2) '(9 3 5 (6 2) 5 1 4)) 
'((6 2) 5 1 4)

遍历 List

Racket 提供了几种基础的遍历列表的方式。

使用 for 循环

(define my-list (list 1 2 3))
(for ([i my-list])
  ; 打印 1, 2, 3
  (displayln i))  

使用 map 函数

map 函数接受一个函数和一个或多个列表,它将这个函数应用到每一个列表元素上,并返回一个新的列表:

(define my-list (list 1 2 3))
; 新的列表为 [2, 3, 4]
(define new-list (map add1 my-list))  

使用 filter 函数

filter 函数接受一个函数和一个列表,它将这个函数应用到每一个列表元素上,并返回一个只包含使得这个函数返回真的元素的新列表:

(define my-list (list 1 2 3 4 5))
; 新的列表为 [1, 3, 5]
(define new-list (filter odd? my-list))  

index-of

If you need to search a list for a value, you can use index-of. It’ll return the index of the value if it appears:

> (index-of '(8 7 1 9 5 2) 9) 
3

It’ll return #f if it doesn’t:

> (index-of '(8 7 1 9 5 2) 10) 
#f

判断

列表是否为空

To test whether a list is empty or not, you can use the null? function:

> (null? '()) 
; test for empty list
#t

> (null? '(1 2 3)) 
#f

最大最小

最小

在 Racket 语言中,你可以使用 apply 函数和 min 函数来获取 List 的最小值。例如,如果你有一个名为 my-list 的 List,你可以使用以下代码来获取它的最小值:

(apply min my-list)

本文作者:Maeiee

本文链接:Racket list

版权声明:如无特别声明,本文即为原创文章,版权归 Maeiee 所有,未经允许不得转载!


喜欢我文章的朋友请随缘打赏,鼓励我创作更多更好的作品!