Seite 4 von 4

Re: bestimmten Ordner suchen

Verfasst: Dienstag 12. April 2011, 14:17
von BlackJack
@Xynon1: AFAIK müssen dann alle überschrieben werden. Was ich auch ziemlich nervig finde.

Re: bestimmten Ordner suchen

Verfasst: Dienstag 12. April 2011, 15:14
von deets
BlackJack hat geschrieben:
Ab Python 2.7 gibt es `functools.cmp_to_key()` um eine Vergleichsfunktion in eine `key`-Funktion umzuwandeln, weil es in Python 3 das `cmp`-Argument bei den entsprechenden Funktionen nicht mehr gibt.
Ist das denn so einfach equivalent zu kriegen? Da __cmp__ paarweise arbeitet, kann man damit ja mehr machen als mit keys. Zb. aufsteigend nach Nachnamen und absteigend nach Vornamen zu sortieren. Das geht AFAIK mit key nicht. Zumindest habe ich da mal einen Vortrag drueber gehoert, der dann halt die Stabilitaet der Sortierung nutzt, und zweimal sortiert. Was immer noch besser oder gut genug war bezueglich des Laufzeitverhaltens, da __cmp__ ja log n mehr aufgerufen wird.

Re: bestimmten Ordner suchen

Verfasst: Dienstag 12. April 2011, 15:25
von BlackJack
@deets: Zumindest gibt es diese Funktion. Was die intern macht, habe ich mir nicht angeschaut.

Ansonsten müsste doch so etwas hier funktionieren (ungetestet):

Code: Alles auswählen

class CmpInverter(object):
    def __init__(self, value):
        self.value = value
    
    def __cmp__(self, other):
        return cmp(other.value, self.value)


def key_func(person):
    return (person.surname, CmpInverter(person.name))
Und wenn man den Sortierschlüssel oder zumindest den Teil auf eine numerischen Wert reduzieren kann, dann reicht ein einfaches unäres ``-`` aus.

Re: bestimmten Ordner suchen

Verfasst: Dienstag 12. April 2011, 15:43
von deets
@BlackJack

Netter Trick! Ist natuerlich __cmp__ durch die Hintertuer ;) Denn damit wird ja wieder fuer jeden Vergleich ein call gemacht. Aber so muesste es gehen, und das kannst du sogar verallgemeinern, indem du nur noch Comparer-Objekte als Keys hast.

Re: bestimmten Ordner suchen

Verfasst: Dienstag 12. April 2011, 16:58
von BlackJack
@deets: Ein Aufruf pro Vergleich wird immer gemacht. Auch wenn da bei `key_func()` nur ``return person.surname`` stünde, wird für jeden Vergleich die `__cmp__`-Methode von diesen Zeichenketten aufgerufen und da natürlich auch ingesamt O(log n) solcher Aufrufe beim Sortieren.

Re: bestimmten Ordner suchen

Verfasst: Dienstag 12. April 2011, 17:54
von deets
@BlackJack

Das ist mir schon klar. Aber der Gewinn von key gegenueber cmp ist ja, dass man in den allermeisten Faellen einen Vergleich auf den builtins hat. Der effizienter implementiert ist, da im Zweifel in C.

Re: bestimmten Ordner suchen

Verfasst: Mittwoch 13. April 2011, 07:02
von eyescube
Danke /me ich schaffs nun alleine.
Sry das ichs einfach nich Kapiert hab :/

Re: bestimmten Ordner suchen

Verfasst: Mittwoch 13. April 2011, 07:34
von Xynon1
@eyescube
Ich will dir nicht zu nahe treten, aber ich glaube du hast es jetzt auch noch nicht kapiert oder kannst du schildern was die einzelnen Komponeten von /me's Code-Schnippsel machen?

Re: bestimmten Ordner suchen

Verfasst: Mittwoch 13. April 2011, 07:58
von eyescube
er sortiert entry nach zeit und nach namen im ordner Linux_Client und sagt mit der Schleife durchlaufe alle Dateien und liste mir die "neueste" Datei auf.Das Entscheidende daran ist das [-1] am schluss damit Python weis was du willst.
So hab ich das verstanden.
du darfst mich korrigieren falls ich falsch liege

Re: bestimmten Ordner suchen

Verfasst: Mittwoch 13. April 2011, 08:05
von /me
eyescube hat geschrieben:er sortiert entry nach zeit und nach namen im ordner Linux_Client und sagt mit der Schleife durchlaufe alle Dateien und liste mir die "neueste" Datei auf.Das Entscheidende daran ist das [-1] am schluss damit Python weis was du willst.
Respekt.

[-1] greift auf das letzte Element zu, da die Tupel in der Liste in aufsteigender Reihenfolge sortiert sind und du das höchstwertige Element haben möchtest. Natürlich ist da relativ viel ineinander gepackt, daher muss man bei einer Fehlerbehandlung (try - except) einige mögliche Fehlerfälle abdecken. Eventuell solltest du dir das Ding in mehrere Zeilen zerlegen.

Re: bestimmten Ordner suchen

Verfasst: Mittwoch 13. April 2011, 08:07
von eyescube
danke /me für den Tipp mit den Fehler abfangen.
wie gesagt ich tu mich schwer mit Python aber verstehen tu ichs is wohl doch wie Englisch lernen also aufgeben tu ich sicher net.. :P

Re: bestimmten Ordner suchen

Verfasst: Mittwoch 13. April 2011, 08:12
von Xynon1
@eyescube
Die [-1] ist so ziemlich das unbedeutenste daran und ist ein schlichter Index und wenn nur die neuste Datei benötigt, sogar unötig. Weil man dann nicht sortieren braucht, sondern wie zuvor schon von BlackJack geschrieben hatte, einfach die max()-Funktion völlig ausreichend ist.
Und nochmal zum mitschreiben man kann nicht die NEUSTE Datei auflisten, denn welche Liste hat immer nur einen Eintrag?

Re: bestimmten Ordner suchen

Verfasst: Mittwoch 13. April 2011, 08:13
von eyescube
xynon, /me hat mich schon verbessert das [-1] brauchste wohl bei der Funktion woher soll Python wissen was du haben willst?!

Re: bestimmten Ordner suchen

Verfasst: Mittwoch 13. April 2011, 08:15
von Xynon1
Das schrieb BlackJack schonmal und ich ebend auch nochmal mit der Built-In Funktion "max()".

Re: bestimmten Ordner suchen

Verfasst: Mittwoch 13. April 2011, 08:19
von eyescube
willst nun terror schieben?
ich hab nun die Lösung die ich brauche und ich bin nun weg also machts gut ihr
und die max-funktion werdn ich mir noch ansehn

Re: bestimmten Ordner suchen

Verfasst: Mittwoch 13. April 2011, 08:54
von BlackJack
@eyescube: Worauf Du auch noch achten solltest, ist das es wirklich nur Dateien sind. `listdir()` liefert nämlich auch Namen von Verzeichnissen. Und wenn dann zufällig die neueste "Datei" ein Verzeichnis ist, dann fällt das Programm beim Kopieren oder spätestens beim Versuch ein Verzeichnis auszuführen auf die Nase.

Übrigens bietet auch PHP sehr verschiedene Ansätze so etwas zu schreiben. Ich hatte das ja erst auch mit sortieren eines Arrays geschrieben, weil mir nicht klar war, dass nur die neueste Datei gesucht war. Die Lösung habe ich dann minimal angepasst, so dass nicht mehr mit `usort()` sortiert wird, sondern mit `array_reduce()` die neueste Datei ermittelt wird. Das ist also eine Lösung die auf den `array_*`-Funktionen aufgebaut ist:

Code: Alles auswählen

function get_newest_file($path) {
    $names = scandir($path);
    if (!$names) return NULL;
    $result = array_reduce(
        array_filter(
            array_map(
                function ($name) use ($path) { return $path . $name; },
                $names
            ),
            'is_file'
        ),
        function ($result, $name) {
            $time = filemtime($name);
            if ($time && $time > $result['time']) {
                $result['name'] = $name;
                $result['time'] = $time;
            }
            return $result;
        },
        array('name' => NULL, 'time' => -1)
    );
    return $result['name'];
}
Danach habe ich das gleiche noch einmal mit `readdir()` implementiert:

Code: Alles auswählen

function get_newest_file2($path) {
    $result = NULL;
    $largest_time = -1;
    if ($dh = opendir($path)) {
        while (($filename = readdir($dh)) !== false) {
            $fullname = $path . $filename;
            if (is_file($fullname)) {
                $time = filemtime($fullname);
                if ($time && $time > $largest_time) {
                    $result = $fullname;
                    $largest_time = $time;
                }
            }
        }
        closedir($dh);
    }
    return $result;
}

Re: bestimmten Ordner suchen

Verfasst: Mittwoch 13. April 2011, 09:20
von eyescube
jip sieht gut aus.
Naja ich ärger mich grad n Ast ab wegen excludes aus der Sicherung.
aber Black Jack ich bin Stolz auf dich du bist mein neues Vorbild ^^.
ich werd mich nun während das so vor sich hinrattert bissl die Doku lesen.
Machts gut bis demnächst