Ich könnte folgenden Code verwalten, um Elemente in einer Liste mit 2 anderen Listen zu ersetzen. Orilist und newlist haben ursprüngliche und neue Begriffe in der Reihenfolge. Der Ersatz wird mit orilist getan und newlist- wenn orilist Artikel in slist sind, wird verändert slist neue Objekte aus newlist haben entsprechen:Funktionelle Programmierung für 3 Listen in Racket
(define (list-replace-from-lists slist orilist newlist)
(define replaced #f)
(define outl '())
(for ((item slist))
(set! replaced #f)
(for ((ori_ orilist) (i (in-naturals)) #:when (equal? item ori_))
(set! outl (cons (list-ref newlist i) outl))
(set! replaced #t))
(when (not replaced)
(set! outl (cons item outl))))
(reverse outl))
2 und 5 bis 12 und 15, die jeweils in (Liste zu ersetzen, 1 2 3 4 5 6):
(list-replace-from-lists (list 1 2 3 4 5 6) (list 2 5) (list 12 15))
Ausgang ist:
'(1 12 3 4 15 6)
obigen Code jedoch nicht funktionsfähig sieht und hat viele Satz! Aussagen. Wie kann dies in funktionalen Code umgewandelt werden? Sollte ich Strukturen oder andere Datentypen für diesen Zweck verwenden?
Bearbeiten: Elemente können in der ursprünglichen Liste, z. (list 1 2 3 4 5 2 6)
Ihre Lösung funktioniert nicht, wenn ein Element später im Heuhaufen erneut auftritt, z. (ersetzen (Liste 1 2 3 4 5 2 6) (Liste 2 5) (Liste 12 15)). Die zweite 2 wird nicht ersetzt. – rnso
@rnso Es funktionierte für das von Ihnen gepostete Beispiel. –
Ich habe ein einfaches Beispiel veröffentlicht und Ihre Lösung ist wirklich elegant dafür. Aber wiederkehrende Artikel sind nicht ausgeschlossen. – rnso