bestimmten Ordner suchen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
BlackJack

@Xynon1: AFAIK müssen dann alle überschrieben werden. Was ich auch ziemlich nervig finde.
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.
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.
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.
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.
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.
eyescube
User
Beiträge: 56
Registriert: Mittwoch 6. April 2011, 06:58

Danke /me ich schaffs nun alleine.
Sry das ichs einfach nich Kapiert hab :/
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

@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?
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
eyescube
User
Beiträge: 56
Registriert: Mittwoch 6. April 2011, 06:58

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
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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.
eyescube
User
Beiträge: 56
Registriert: Mittwoch 6. April 2011, 06:58

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
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

@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?
Zuletzt geändert von Xynon1 am Mittwoch 13. April 2011, 08:13, insgesamt 1-mal geändert.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
eyescube
User
Beiträge: 56
Registriert: Mittwoch 6. April 2011, 06:58

xynon, /me hat mich schon verbessert das [-1] brauchste wohl bei der Funktion woher soll Python wissen was du haben willst?!
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Das schrieb BlackJack schonmal und ich ebend auch nochmal mit der Built-In Funktion "max()".
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
eyescube
User
Beiträge: 56
Registriert: Mittwoch 6. April 2011, 06:58

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
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;
}
eyescube
User
Beiträge: 56
Registriert: Mittwoch 6. April 2011, 06:58

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
Antworten