Ersetzen einer Unterliste durch das erste Element in der Unterliste

8

Ich bin ziemlich neu bei Mathematica und bin von diesem Problem überrascht. Ich habe eine Liste, die so aussieht:

%Vor%

Ich möchte jede Unterliste durch ihr erstes Element ersetzen. Also sollte die obige Liste in folgendes umgewandelt werden:

%Vor%

Ich habe die Dokumentation wiederholt durchgesehen und stundenlang gegoogelt. Ich bin sicher, dass das ziemlich einfach ist, aber ich kann es nicht herausfinden. Ich begann mit dieser Liste:

%Vor%

Ich muss wissen, wie viele Läufe von 1's sind, was offensichtlich 2 ist. Also habe ich Split verwendet, um die Liste in Gruppen von aufeinanderfolgenden 1 und 0 zu trennen. Durch die Verwendung von Länge in dieser Liste kann ich die Gesamtanzahl der Läufe ermitteln, also 3. Jetzt muss ich nur die Anzahl der Läufe von 1 berechnen. Wenn ich die Liste wie oben erwähnt konvertieren kann, kann ich einfach die Elemente in der Liste summieren, um die Antwort zu erhalten.

Ich hoffe, das macht Sinn. Danke für jede Hilfe!

    
Tim Mayes 26.11.2011, 00:26
quelle

5 Antworten

6

Ich würde das tun:

%Vor%

oder

%Vor%     
Chris Degnen 26.11.2011, 00:37
quelle
12

Die vorgeschlagenen Lösungen sind ziemlich schnell, aber wenn Sie extreme Effizienz (riesige Listen) wollen, ist hier eine andere, die eine Größenordnung schneller wäre (formuliert als eine reine Funktion):

%Vor%

Zum Beispiel:

%Vor%

BEARBEITEN

Ich habe mich nicht dazu entschlossen, die "große Schießerei" zu initiieren, aber während wir dabei sind, lasst mich die größte Schießkompilation nach C ziehen:

%Vor%

Jetzt,

%Vor%

Natürlich ist das keine elegante Lösung, aber es ist einfach.

BEARBEITEN 2

Verbessert die Optimierung von @Sjoerd, diese wird etwa 1,5 schneller sein als runsOf1C still:

%Vor%     
Leonid Shifrin 26.11.2011 01:53
quelle
8

Sie haben tatsächlich zwei Fragen, die eine aus dem Titel und die Frage, die dahinter lauert. Die erste Antwort lautet:

%Vor%

Der zweite, der die Anzahl der Läufe von Einsen zählt, wurde viele Male beantwortet, aber diese Lösung

%Vor%

ist etwa 50% schneller als die Lösung von Leonid. Hinweis: Ich habe die Länge der Testliste für ein besseres Timing erhöht:

%Vor%

Nach Leonids Kompilierungsangriff wollte ich gerade das Handtuch werfen, aber ich entdeckte eine mögliche Optimierung, also geht weiter in den Kampf ... [Mr.Wizard, Leonid und ich sollten ins Gefängnis geworfen werden, weil wir den Frieden auf SO gestört haben ]

%Vor%

Die Ergebnisse variieren, aber ich bekomme eine Verbesserung zwischen 10 und 30%.

Die Optimierung ist möglicherweise schwer zu erkennen, aber es ist die zusätzliche i++ , wenn der {0,1} -Test erfolgreich ist. Sie können nicht zwei davon hintereinander haben.

Und hier, eine Optimierung von Leonids Optimierung meiner Optimierung seiner Optimierung (ich hoffe, dass es nicht weitergeht, oder ich werde einen Stack-Überlauf erleiden):

%Vor%

Zum Glück hatte Leonid eine überflüssige Initialisierung in seinem Code, die entfernt werden konnte.

    
Sjoerd C. de Vries 26.11.2011 11:25
quelle
7

Hier ist eine Variante von Leonids Differences -Methode, die etwas schneller ist:

%Vor%

Verglichen (mit Tr für beide):

%Vor% %Vor% %Vor%

Da dies zu einem Code-Effizienz-Wettbewerb geworden ist, hier ist meine nächste Anstrengung:

%Vor%

Außerdem bekomme ich mit Mathematica 7 sehr unterschiedliche Ergebnisse, also füge ich sie hier als Referenz ein:

%Vor%     
Mr.Wizard 26.11.2011 08:14
quelle
6

Ein anderer Ansatz, der Count verwendet, um nach Listen zu suchen, die eine Anzahl von Wiederholungen von 1 enthalten:

%Vor%     
Brett Champion 26.11.2011 00:57
quelle

Tags und Links