从Racket

时间:2017-04-11 19:41:28

标签: racket

我正在尝试编写一个代码,用于从列表的每个顶级元素中删除括号。例如,输入'((1 2)(3 4))将产生'(1 2 3 4)并且输入'((x(y))z)应产生'(x(y)z)。< / p>

有没有办法识别成对的括号?我以为我可以找到一对括号并删除它们,但我不知道该怎么做以及如何只从顶部元素中删除。

2 个答案:

答案 0 :(得分:0)

模式&#34;我正在尝试(做某事)列表的每个顶级元素&#34;是map将涉及的确定信号。此外,您的第一个示例案例中有一个重要线索:

'((1 2) (3 4))  =>  '(1 2 3 4)

那只是append*

(append* '((1 2) (3 4)))  =>  '(1 2 3 4)

'((x (y)) z) => '(x (y) z)并非如此。

(append* '((x (y)) z))  =>  '(x (y) . z)

如果你仔细想想,append*非常接近你想要的东西:它从列表中的每个元素中解开一个级别的parens。问题是,输入中的某些元素不是列表,因此无需解包。

我们可以通过将每个非列表元素包装在单个列表中来解决这个问题,以便'((x (y)) z)变为'((x (y)) (z))。然后我们可以使用append*

(append* '((x (y)) (z)))  =>  '(x (y) z)

这是map方便的地方。 map是一个函数,它接受函数(f)和列表(lst)并返回通过将f应用于lst的每个元素而生成的新列表}。例如:

(map symbol? '(a 2 b c 5))  =>  '(#t #f #t #t #f)

假设您编写了一个带有一个参数的函数,如果它是一个列表则返回它,或者如果它不是,则将其包装为单例列表。我们称之为maybe-wrap。然后,您可以在输入上映射maybe-wrap,结果可以传递给append*

(define (remove-parens lst)
  (append* (map maybe-wrap lst)))

我会留给你写maybe-wrap

答案 1 :(得分:0)

不使用map(define (unwrap lst) (if (null? lst) '() (my-append (car lst) (cdr lst)))) (define (my-append lhs rhs) (cond [(null? lhs) (unwrap rhs)] [(pair? lhs) (cons (car lhs) (my-append (cdr lhs) rhs))] [else (cons lhs (unwrap rhs))])) ,您可以定义mutually recursive函数来执行您想要的操作,如下所示:

> (unwrap '((1 2) (3 4 (5 (6)))))
'(1 2 3 4 (5 (6)))
> (unwrap '((x (y)) z))
'(x (y) z)

例如:

import matplotlib.pyplot as plt
import numpy as np
import scipy.stats as stats

depDelay.sort()
plt.hist(depDelay, bins=100, normed=True)
hmean = np.mean(depDelay)
hstd = np.std(depDelay)
pdf = stats.norm.pdf(depDelay, hmean, hstd)
markers = [np.percentile(depDelay,50)]
plt.plot(DepDelay, pdf,'-o',markevery=markers)
plt.title('Distribution of Departure Delay')
plt.xlabel('Departure Delay (in mins)')
plt.ylabel('Frequency')
plt.savefig('depDelayNormDist.png')
plt.show()