2016-11-04 4 views
2

Die folgenden Beispielcodes abrufen alle laufenden Prozesse und drucken sie. Sie wurden nach dem 3. Beispiel here und dem letzten von here geschrieben. Problem ist, ich kann nicht herausfinden, warum nur der erste Prozess sortiert wie gewünscht abruft.Python Lambda-Funktion zum Sortieren der Liste nach Wörterbuch

Ich denke, es ist mit der lambda Funktion Konstruktion verwandt. Aber das richtig laufende Sample, das erste, scheint die lokale Variable der for-Anweisung mit dem p.dict Dictionary zu mischen, so dass ich stecken bleiben kann.

Erstes Beispiel:

import psutil 

procs = [] 

for p in psutil.process_iter(): 
    try: 
     p.dict = p.as_dict(['pid', 'name']) 
    except psutil.NoSuchProcess: 
     pass 
    else: 
     procs.append(p) 

processes = sorted(procs, key=lambda p: p.dict['name'], reverse=False) 

print(processes) 

Die zweite Probe:

import psutil 

procs = [] 

for proc in psutil.process_iter(): 
    try: 
     procs_dic = proc.as_dict(['pid', 'name']) 
    except psutil.NoSuchProcess: 
     pass 
    else: 
     procs.append(proc) 

processes = sorted(procs, key=lambda ordem: procs_dic['name'], reverse=False) 

print(processes) 

Antwort

3

Ihr zweites Code-Snippets Lambda sieht 'name' im selben Wörterbuch nach, egal, welches Objekt es passiert; Wie könnte das funktionieren?

Ihre dritte scheint nicht einmal versucht, die Prozesse zu sortieren; Ich bin mir nicht sicher, was es mit der Frage zu tun hat.

Die Änderung, die Sie gemacht haben den ersten Schnipsel in die zweite drehen ist offenbar durch Ihre Sorge begründet, dass der erste

scheint mit dem p.dict Wörterbuch der lokalen p Variable der for-Anweisung zu mischen

und ich würde glücklich sein zu helfen, aber ich fürchte, ich verstehe nicht, welches Problem Sie sehen. Vielleicht hilft das Folgende? Es gibt zwei Variablen hier genannt. Die erste wird in der Schleife über Prozesse verwendet; Jedes Mal um die Schleife herum ist ihr Wert ein Prozessobjekt, und wir geben diesem Prozessobjekt ein dict Attribut mit einem Eintrag für 'name'. Die zweite ist das Argument für Ihre anonyme Funktion (Lambda): Ihr Wert ist auch immer ein Prozessobjekt.Sie könnten ihnen verschiedene Namen geben, wenn Sie wollten, und es würde nichts brechen, aber eigentlich denke ich, es ist klarer, wie es ist: In diesem kleinen Code ist p das, was Sie eine Variable nennen, deren Wert ein Prozessobjekt ist. Aber nichts wird "durcheinander".

+0

Eigentlich habe ich die vorletzte Zeile geändert 'Prozesse = sortiert (Procs, key = Lambda ordem: ordem.dict [ 'name'], Reverse = False)', folgende @JordanMcQueen Spitze. Allerdings konnte ich die Aufgabe nur ausführen, nachdem ich 'proc.dict = proc.as_dict (['pid', 'name'])' die Zeile nach 'try' geändert hatte. –

+0

Rechts. Nachdem Sie das getan haben, haben Sie genau den gleichen Code wie im ersten Snippet * außer *, dass Sie eine der Variablen namens 'p' in' proc' und die andere in 'ordem' umbenannt haben. –

1

in der ersten Probe, die lambda Funktion nimmt etwas var p und gibt p.dict['name']. Du könntest hier zu x oder was auch immer du willst ändern: es ist nur ein Platzhalter.

In der zweiten Probe, key=lambda ordem: procs_dic['name'], reverse=False) nimmt die lambda etwas ordem genannt und gibt dann nur procs_dic['name'] immer und immer wieder.

Die Art, wie der Schlüssel in sorted funktioniert, ist dies: wie es über die Elemente iteriert und sortiert sie, ruft es die lambda auf jedes Element, um zu bestimmen, welchen Wert zu sortieren.

Meine Vermutung ist, dass Sie die sorted Codezeile in dem zweiten Beispiel wie folgt aussehen wollen:

processes = sorted(procs, key=lambda x: x.name(), reverse=False)

Beachten Sie, dass Process.name(), um den Namen des Prozesses zurück.

1

Verwenden Sie eine Wörterbuchzuordnung Process es zu Wörterbüchern, die ihre Informationen enthalten.

proc_dict = {} 
for proc in psutil.process_iter(): 
    try: 
     proc_dict[proc] = proc.as_dict(['name', 'pid']) 
    except psutil.NoSuchProcess: 
     continue 

Dann sortieren nach name Wert des Wörterbuchs für diesen Prozess.

print(*sorted(proc_dict, lambda x: proc_dict[x]['name'])) 
Verwandte Themen