我正在尝试编写一个代码,用于从列表的每个顶级元素中删除括号。例如,输入'((1 2)(3 4))将产生'(1 2 3 4)并且输入'((x(y))z)应产生'(x(y)z)。< / p>
有没有办法识别成对的括号?我以为我可以找到一对括号并删除它们,但我不知道该怎么做以及如何只从顶部元素中删除。
答案 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()