2012-12-06 51 views
2

像這樣:如何在計劃中追加像Python?

> (my-append (list 1 2) 3) 
'(1 2 3) 

我知道appendracket實際上是連接兩個列表。 而cons只是一個元素添加到列表中的,而不是

有沒有人有這個想法?

回答

5

在Pyton,該append()方法修改就地名單:

lst = [1, 2] 
lst.append(3) 

lst 
=> [1, 2, 3] 

球拍的列表是在默認情況下不可變的,最接近於就地append()要求您使用可變的列表,你必須元素收拾附加在它自己的列表中:

(require scheme/mpair) 

(define lst (mlist 1 2)) 
(mappend! lst (mlist 3)) 

lst 
=> (mlist 1 2 3) 

注意,使用不可變列出與append過程將產生一個新的列表,而原始列表不變 - 所以它不會是「像Python」:

(define lst (list 1 2)) 
(append lst (list 3)) ; this returns the new list '(1 2 3) 

lst 
=> (list 1 2) 

事實上,方案的append程序的行爲就像列表之間Python的+操作:

lst = [1, 2] 
lst + [3] # this returns the new list [1, 2, 3] 

lst 
=> [1, 2] 

試想想它,Python的append()威力^ h一個誤導的名字 - 在大多數函數式編程語言中,附加操作總是在兩個列表之間定義,而在Python中它是列表和元素之間的操作。也許add()將會是一個更好的名字,比如Java的add()操作的List接口。

0

我不知道你的意思「追加像巨蟒」是什麼,但如果你想要的是插入在列表的最後一個新的元素,你可以使用這個:

(define (my-append lst el) 
    (append lst (list el))) 
+0

Python的追加方法是支持自動增長的向量狀數據結構上的變異。需要注意的是,Python使用的術語「list」應該被定義爲「可生長的,可變的向量」。 – dyoo

3

如果您在Racket中,您可能需要查看可生長的矢量庫(data/gvector)。這提供了一種容器類型,它支持您習慣使用Python可增長列表的許多功能。

例子:

#lang racket 
(require data/gvector) 
(define lst (gvector 1 2)) 
(gvector-add! lst 3) 
(for ([elt lst]) (printf "I see: ~s\n" elt)) 

否則,你的問題最終減少了:我怎麼做一成不變的鏈表的工作就像可變的順序分配的數組?這不會很好:數據類型因不同原因而不同。