bestimmten Ordner suchen
@Xynon1: AFAIK müssen dann alle überschrieben werden. Was ich auch ziemlich nervig finde.
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 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.
@deets: Zumindest gibt es diese Funktion. Was die intern macht, habe ich mir nicht angeschaut.
Ansonsten müsste doch so etwas hier funktionieren (ungetestet):
Und wenn man den Sortierschlüssel oder zumindest den Teil auf eine numerischen Wert reduzieren kann, dann reicht ein einfaches unäres ``-`` aus.
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))
@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.
Netter Trick! Ist natuerlich __cmp__ durch die Hintertuer

@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.
@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.
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
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?
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?
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
So hab ich das verstanden.
du darfst mich korrigieren falls ich falsch liege
Respekt.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.
[-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
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?
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.
@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:
Danach habe ich das gleiche noch einmal mit `readdir()` implementiert:
Ü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'];
}
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;
}
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
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