Zum Beispiel habe ich eine Liste (1 2 3 4 5 6 7 8 9 10 11)
, und will es um 3 Elemente (oder eine andere Länge) aufrauen, um ((1 2 3) (4 5 6) (7 8 9) (10 11))
zu bekommen. Welchen schönen Code könnte ich dafür verwenden? Vielen Dank.Wie wird eine Liste in einem funktionalen Stil aufgeraut (im Gegensatz zu flatten)?
Antwort
def split[A](list : List[A], n : Int) : List[List[A]] = list match {
case List() => List()
case _ => (list take n) :: split(list drop n, n)
}
List(1,2,3,4,5,6,7,8,9,10,11) grouped 3 toList
res0: List[List[Int]] = List(List(1, 2, 3), List(4, 5, 6),
List(7, 8, 9), List(10, 11))
+1 Schön! ...... – Dario
Gut! hast du einen clojure code? – user342304
In Scala 2.8 mischt Liste in IterableLike, die die gruppierten Methode hat, die einen Iterator [Liste [T]] gibt, die wiederum umgerechnet werden können zur Liste [Liste [T]].
List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11).grouped(3).toList
res3: List[List[Int]] = List(List(1, 2, 3), List(4, 5, 6), List(7, 8, 9), List(10, 11))
Wenn Sie eine aufrauen Methode auf Liste möchten, können Sie eine implizite Konvertierung verwenden, so etwas wie:
scala> class RList[T](val l: List[T]) {def roughen(n: Int) = l.grouped(n).toList}
defined class RList
scala> implicit def list2rlist[T](l: List[T]) = new RList(l)
list2rlist: [T](l: List[T])RList[T]
scala> List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11) roughen 3
res5: List[List[Int]] = List(List(1, 2, 3), List(4, 5, 6), List(7, 8, 9), List(10, 11))
Hoppla, habe Thomas Antwort nicht gesehen. –
Alle Antwort ist sehr nett! aber der gruppierte Name ist schlecht, der grobe ist allgemeiner, wie gegen flatten: P, vielleicht rauhen erhalten eine Funktion, die dadurch aufrauhen, solche Länge, Regex ..., wird besser – user342304
Aber rauhen würde bedeuten (zu mir mindestens) dass die Listen nicht die gleiche Länge hatten wie ein unregelmäßiges Array. Ich denke, Partition wird in anderen Sprachen/Bibliotheken für die gleiche Operation verwendet. – pdbartlett
Dies ist die beste könnte ich kommen mit:
def roughen(l:List[_],s:Int):List[_] ={
if (l.isEmpty) return Nil
val l2 = l.splitAt(s)
l2._1 :: roughen(l2._2,s)
}
val l = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
roughen(l,3)
//returns: List(List(1, 2, 3), List(4, 5, 6), List(7, 8, 9), List(10))
Seit Du verwendest auch das Clojure-Tag ...
Es gibt eine eingebaute Funktion, um das in Clojure 1.2 zu tun, das auch in 1.1 in cloj verfügbar ist ure.contrib.seq-utils.
(partition-all 3 [1 2 3 4 5 6 7 8 9 10 11])
; => ((1 2 3) (4 5 6) (7 8 9) (10 11))
Siehe auch partition
und partition-by
. Beachten Sie auch, dass partition
und partition-all
einige optionale Argumente akzeptieren, wenn Sie etwas anderes benötigen, siehe z. (doc partition)
an der REPL.
Ich bin oft erstaunt über die Funktionsvielfalt in den Clojure-Bibliotheken ... aber ich wünschte, es gäbe einen schlauen Weg, um die zu finden, die man schnell haben möchte! (natürlich fragen die Superstars auf Stackoverflow ist immer eine Option :-)) – mikera
Siehe http://clojure.org/cheatsheet - Partition ist genau dort in "Nested Seqs". –
Hier ist eine Clojure 1.0-kompatible Implementierung von aufrauen:
(defn roughen
"Roughen sequence s by sub-grouping every n elements.
e.gn (roughen '(a b c d) 2) -> ((a b) (c d))"
[s n]
(loop [result() s s]
(cond (empty? s)
result
(< (count s) n)
(concat result (list s))
:default
(recur (concat result (list (take n s))) (drop n s)))))
user=> (roughen '(a b c d e f g) 2)
((a b) (c d) (e f) (g))
user=> (roughen '(a b c d e f) 2)
((a b) (c d) (e f))
user=> (roughen '(a b c d e f) 4)
((a b c d) (e f))
user=>
Und einer andere clojure Version, in mehr idiomatischen clojure geschrieben.
(defn roughen
[n coll]
(lazy-seq
(when-let [s (seq coll)]
(let [[l r] (split-at n s)]
(cons l (roughen n r))))))
Hinweis, dass split-at
durchläuft die Eingangssequenz zweimal. So können Sie die Standardversion mit folgenden ersetzen:
(defn split-at
[n coll]
(loop [n n, s coll, l []]
(if-not (zero? n)
(if-let [s (seq s)]
(recur (dec n) (rest s) (conj l (first s)))
[l nil])
[l s])))
(. Natürlich würde man verwenden partition
und Freunde wie bereits oben erwähnt)
- 1. Mehrfaches Satzverständnis in einem funktionalen Stil
- 2. Flatten eine Liste in Python
- 3. Wie analysiere ich eine Zeichenfolge in eine Liste von Schwimmern mit funktionalen Stil?
- 4. F # Sequenz Filter Während in einem funktionalen Stil
- 5. Wie eine komplexe Indizierung Abfrage auf einem Datenrahmen in einem funktionalen Stil
- 6. Java: Bibliotheken für unveränderliche Datenstrukturen im funktionalen Stil
- 7. Scala flatten Liste
- 8. In .NET, wie erstelle ich eine Junction in NTFS, im Gegensatz zu einem Symlink?
- 9. eine Liste Flatten mit komplexen verschachtelten Struktur
- 10. Frage zum funktionalen OOP-Stil in JavaScript
- 11. Wie erhält man den angegebenen Stil von CSS im Gegensatz zum berechneten Stil aus dem Element?
- 12. RequireJS: Wann 'Pfade' im Gegensatz zu 'Paketen'
- 13. JavaScript im funktionalen Stil: Gute Praxis, um eine Argumentation zu vermeiden?
- 14. Erfolgsmeldungen im Gegensatz zu staatlichen Fehlermeldungen
- 15. Dauer nicht DAYS im Gegensatz zu Klassendokumentation
- 16. In welchen Fällen wird Socket.getLocalAddress() ein IPv6 im Gegensatz zu einem IPv4 sein?
- 17. Lambdaj Gruppe von Flatten Liste
- 18. Impliziter Konstruktor im Gegensatz zu "leerem" Konstruktor
- 19. F # - Konvertieren geschachtelter for-Schleifen in einen funktionalen Stil
- 20. Java 8 funktionalen Stil mit Indexen zu iterieren
- 21. R Flatten Liste von Spalten zur Liste
- 22. Wann sollte eine Eigenschaft im Gegensatz zu einem Label in Neo4j verwendet werden?
- 23. wie und im Gegensatz zu System in PHP usin mysqli
- 24. Flatten eine NSArray
- 25. val() Schleife Möglichkeiten im Gegensatz zu jedem()
- 26. linkbuttons Verhalten Postbacks im Gegensatz zu Postback
- 27. Wie funktioniert Komponententest, wenn das Programm nicht zu einem funktionalen Stil passt?
- 28. Verwendung von getBean im Gegensatz zu Methode Injektion im Frühjahr
- 29. Wo finde ich eine Liste von Artikeln im Android-Stil?
- 30. Wie funktioniert Gerät mmap im Gegensatz zu E/A-Adressenports?
-1 für Stil. Schwierig, die eigentliche Frage herauszufinden – Dario
"Roughen"? Ich würde das persönlich als "gruppiert" bezeichnen, wie auch Scala. :-) –