2010-11-23 6 views
12

Ich habe eine Liste von Objekten in Python, und sie haben jeweils eine id Eigenschaft. Ich möchte eine Liste dieser IDs erhalten.Python-Äquivalent von C#. Wählen Sie?

In C# würde ich

schreiben
myObjects.Select(obj => obj.id); 

Wie würde ich dies in Python?

Antwort

10
[obj.id for obj in myObjects] 
+0

Recht .. Listenkomprehensionen. Vergiss diese :) – mpen

17

Schauen Sie sich den Abschnitt „Listenkomprehension“ hier: http://docs.python.org/tutorial/datastructures.html

Wenn Ihr Startliste genannt wird original_list und Ihre neue Liste genannt wird id_list, könnten Sie so etwas tun:

id_list = [x.id for x in original_list] 
6

Wenn es eine große Liste ist und Sie die Ids nur einmal verarbeiten müssen, dann gibt es auch Generatorausdrücke.

ids = (obj.id for obj in my_objects) 

for id in ids: 
    do_something(id) 

Ein Generator Ausdruck nicht unterstützt Random Access sondern Sie jede ID auf Anfrage erhalten und so vermeidet den Aufbau einer Liste alle auf einmal. Generatorausdrücke sind zu xrange als Liste Comprehensions sind zu range.

Eine weitere Einschränkung mit Generatorausdrücken ist, dass auf sie nur so lange zugegriffen werden kann, wie eine Ressource darin noch offen ist. Zum Beispiel wird der folgende Code fehlschlagen.

with open(filename) as f: 
    lines = (line for line in f) 

# f is now closed 
for line in lines: 
    print line 

Das äquivalente Listenverständnis würde in diesem Fall funktionieren.

1

Niemand bei klarem Verstand würde dies tut die folgende Art und Weise, aber hier ist es für den Fall, kommt es praktisch in einem komplexeren Beispiel

import operator 
map(operator.attrgetter("id"), myObjects) 
2

Wenn Sie eine direkte Entsprechung von C# wählen in Python wollen, Auf Kosten der Verwendung einer Drittanbieter-Bibliothek können Sie das asq-Paket verwenden, das eine LINQ-für-Objekte inspirierte Implementierung über Python-Iterablen bietet. Mit asq der C# -Code in Ihrer Frage werden würde:

from asq.initiators import query 
query(myObjects).select(lambda obj: obj.id) 

oder mit einem anderen Merkmale von asq kombiniert:

from asq.selectors import a_ 
query(myObjects).select(a_("id")) 
Verwandte Themen