2016-07-30 18 views
1

Ich habe eine .NET-Struktur, die Arrays mit Arrays enthält. Ich möchte, wenn möglich, eine Liste von Elementelementen aus einem bestimmten Array in einem bestimmten Array erstellen, wobei das Listenverständnis in IronPython verwendet wird.Geschachtelte Liste Verständnis gegen. NET-Arrays innerhalb von Arrays

Hier ist, was ich jetzt tue:

tag_results = [item_result for item_result in results.ItemResults if item_result.ItemId == tag_id][0] 
tag_vqts = [vqt for vqt in tag_results.VQTs] 
tag_timestamps = [vqt.TimeStamp for vqt in tag_vqts] 

So erhalten die einzelnen Artikel ergeben sich aus dem Ergebnis-Reihe, die meinen Zustand übereinstimmt, dann VQTS Arrays von diesen Artikel Ergebnisse erhalten, erhalten dann alle Zeitstempel Mitglieder für jeden VQT im vqts-Array.

Will dies in einem einzigen Aussage Overkill tun? Später werden die Zeitstempel in dieser Weise verwendet:

vqts_to_write = [vqt for vqt in resampled_vqts if not vqt.TimeStamp in tag_timestamps] 

Ich bin nicht sicher, wenn ein Generator angebracht wäre, da ich nicht wirklich durch sie Looping, ich möchte nur eine Liste aller Zeitstempel für alle Item Ergebnisse für diesen Artikel/Tag, so dass ich Mitgliedschaft in der Liste testen kann.

Ich muss dies mehrmals für verschiedene Kontexte in meinem Skript tun, also habe ich mich nur gefragt, ob ich das in einer effizienten und pythischen Weise mache. Ich überarbeite das zu einer Methode, die mich dazu gebracht hat, es einfacher zu machen.

FYI, das ist IronPython 2.6, eingebettet in eine feste Umgebung, die die Verwendung von numpy, Pandas usw. nicht erlaubt. Es ist sicher anzunehmen, ich brauche eine Python 2.6 einzige Lösung.

Meine Hauptfrage ist:

würde dies in einer einzigen Zeile, wenn möglich kollabiert, den Code verschleiern?

Wenn Kollabieren angemessen ist, wäre eine Methode übertrieben?

Zwei! Meine zwei Hauptfragen sind:

Würde diese in einer einzigen Zeile zusammenklappen, wenn möglich, den Code verschleiern?

Wenn Kollabieren angemessen ist, wäre eine Methode übertrieben?

Ist ein Generator zum Testen der Mitgliedschaft in einer Liste geeignet?

Drei! Meine drei Fragen sind ... Zu meinen Fragen sind so unterschiedliche Abfragen als ... ich wieder kommen werde ...

(es ist Python ...)

Antwort

1

tag_results = [...][0] baut eine ganz neue Liste nur um einen Artikel zu bekommen. Dies ist, was next() an einem Generator Ausdruck für:

next(item_result for item_result in results.ItemResults if item_result.ItemId == tag_id) 

die nur Iterierten gerade genug, um ein erstes Element zu erhalten.

Sie kann inline, aber ich würde das als separate Ausdruck für die Lesbarkeit halten.

ist der Rest einfach in einen Ausdruck setzen:

tag_results = next(item_result for item_result in results.ItemResults 
        if item_result.ItemId == tag_id) 
tag_timestamps = [vqt.TimeStamp for vqt in tag_results.VQTs] 

ich, dass ein gesetzt machen würde, wenn Sie nur die Mitgliedschaft Tests tun müssen, um:

tag_timestamps = set(vqt.TimeStamp for vqt in tag_results.VQTs) 

Die Sätze für die konstante Zeit erlauben Mitgliedschaftstests; Das Testen gegen eine Liste dauert linear, da die gesamte Liste für jeden dieser Tests gescannt werden könnte.

+1

Ausgezeichnete Informationen! Ich lerne langsam über die Standard-Bibliothek, wenn ich auf die Notwendigkeit von Dingen stoße, aber manchmal, wenn ich nicht zufällig zufällig durch die Dokumente stolpere oder mich an ein paar Minuten von einem Online-Video erinnere, das ich vor Monaten gesehen habe, vergesse ich die Dinge, bis ich sie veröffentliche in der Praxis. Das war die Information, die ich brauchte. Ich habe auch "frozenset" für unveränderliche Listen notiert, die die Mehrheit von mir sind. Vielen Dank! – noelhx

Verwandte Themen