我如何将字符串列表转换为 Racket 中的列表列表

How do i convert a list of strings into a list of lists in Racket

我在将字符串列表转换为列表列表以及每个列表中的项目转换时遇到问题。假设我有列表:

("ZZ 9 8" "T 188 8" "L 5 10") 我怎样才能将其转换为;

(("ZZ" 9 8) ("T" 188 8) ("L" 5 10)) 这样数字就是数字,字符串就是字符串?

您可以 map 对每个字符串进行拆分,将第一个元素保留为字符串并将其他元素转换为数字。像这样:

(define (convert strs)
  (map (lambda (str)
         (let ((strlist (string-split str)))
           (cons (first strlist)
                 (map string->number (rest strlist)))))
       strs))

例如:

(convert '("ZZ 9 8" "T 188 8" "L 5 10"))
=> '(("ZZ" 9 8) ("T" 188 8) ("L" 5 10))

仅输入字符串中的第一个标记应保留为字符串,所有其他字符串应转换为数字的假设是脆弱的。定义两个过程即可轻松解决问题。

parse-nstring 过程接受一个可能包含数字标记的字符串和 returns 一个字符串和数字列表。当 string->number 过程 returns #f 无法将字符串转换为数字时。 parse-nstring仅在转换成功时使用string->number的结果;否则保留原始令牌。这是通过将原始 space 分隔的字符串拆分为子字符串,并使用一个匿名过程映射该列表来实现的,该过程采用一个子字符串和 returns 一个数字(如果它可以转换为数字),或者否则为原始子串。

parse-nstrings 过程接受一个字符串列表和 returns 一个包含解析每个字符串的结果的列表。此过程只是将 parse-nstring 过程映射到输入列表上。

(define (parse-nstring str)
  (let ((substs (string-split str)))
    (map (lambda (subst) (let ((token (string->number subst)))
                           (or token subst)))
         substs)))

(define (parse-nstrings strs)
  (map parse-nstring strs))
strings-to-lists.rkt> (parse-nstrings '("ZZ 9 8" "T 188 8" "L 5 10"))
'(("ZZ" 9 8) ("T" 188 8) ("L" 5 10))

strings-to-lists.rkt> (parse-nstrings '("THX 11 38" "99 Red Ballons" "1 O'Clock 2 O'Clock 3 O'Clock Rock"))
'(("THX" 11 38) (99 "Red" "Ballons") (1 "O'Clock" 2 "O'Clock" 3 "O'Clock" "Rock"))