Python: Filtern basierend auf spezifische Arrays in einer Liste?
Hey,
ich habe so etwas wie:
[{raum: "100", name: "name", gebäude: "rathaus"}, {raum: "430", name: "name", gebäude "supermarkt"}...]
... nur weiß ich nicht genau wie man so etwas nenne soll... Ich hoffe nur auf eine Lösung für Folgendes:
Diese verschiedenen [{},{}] zu filtern und mir nur alle anzuzeigen, welche gebäude: "rathaus" enthalten.
Wie geht das? Bitte um eine Lösung und eine Erklärung dazu. :) Danke
1 Antwort
Zum Beispiel mit einer List Comprehension, wobei wir eine neue Liste aus der bestehenden aufbauen, aber jedes Element auf eine Bedingung prüfen:
>>> data = [{"raum": "100", "name": "name", "gebäude": "rathaus"}, {"raum": "430", "name": "name", "gebäude": "supermarkt"}]
>>> data_filtered = [g for g in data if g["gebäude"] == "rathaus"]
>>> data_filtered
[{'raum': '100', 'name': 'name', 'gebäude': 'rathaus'}]
Alternativ kann man auch filter() verwenden.
"Arrays" sind hier übrigens gar nicht zu finden. Das ist eine Liste von Dictionarys.
"Irgendwie funktioniert es nicht" ist halt keine sehr brauchbare Fehlerbeschreibung. Den obigen Ausschnitt kannst du ganz einfach selbst ausprobieren.
Alles klar. Ich versuche es mal etwas genauer zu erläutern. Online Stundenplan Webuntis... ich versuche mich über die API mit Python einzuloggen. Hat auch geklappt. Nur versuche ich jetzt mit der Funktion rooms() [alle Räume die Webuntis zur Verfügung stehen] alle Räume mit "building":"WS" zu finden... Klappt nur nicht. Noch nicht. Nachher möchte ich einen Alexa Skill erstellen, welcher mir dann den aktuellen Stundenplan vorliest in Woche/Stunde XYZ usw.
Das steht mir zur Verfügung: https://webuntis.noim.me/classes/WebUntis.html#constructor
Nur bin ich auch mal wieder zu dumm... new webuntis.. scheint nicht definiert zu sein.
Das steht mir zur Verfügung: https://webuntis.noim.me/classes/WebUntis.html#constructor
Aha. Das ist halt Typescript, nicht Python.
Und es ist letztlich auch egal, aus welchem API die Liste kommt, gefiltert wird sie in jedem Fall gleich.
Tja. Bin halt einfach dämlich... 😁 Nun... ich meinte eigentlich https://python-webuntis.readthedocs.io/en/latest/session.html#things-you-can-do-with-the-api diese Seite... Aber das filtern klappt nicht... "TypeError: 'RoomObject' object is not subscriptable"
mein Code:
data = s.rooms()
data_filtered = [g for g in data if g['building'] == 'WS']
print(data_filtered)
Da kommt allerdings keine normale Python-Liste, sondern eine spezielle RoomList mit RoomObject-Instanzen raus. Und die hat einschlägige Methoden, wie man nach 2 Klicks erfährt: https://python-webuntis.readthedocs.io/en/latest/objects.html#webuntis.objects.ListResult
Aus meiner Sicht ein etwas verkompliziertes und nicht sehr "pythonisches" API, aber es sollte können, was du brauchst.
Sche**e, es tut mir leid. Ich bin eben einfach erst seit etwa... heute in Python drinne.. bzw. beschäftige mich damit. Aber was nutze ich jetzt? Die Filter-Function? Richtig?
Anscheinend kann man auch Comprehensions verwenden. Aber es sind eben keine Dictionaries in der Liste drin, sondern RoomObjects. Also würde ich etwa sowas hier probieren:
[raum for raum in rooms_resultat if raum.name == "dings"]
Oder mit der filter()-Methode mutmaßlich sowas wie
rooms_resultat.filter(name="dings")
Wobei RoomObject zwei Attribute hat (name und long_name), keine Ahnung welches du anschauen musst.
Mh... ich brauche eigentlich building... name und long_name helfen nichts...
es gibt id, name, longName, active, did und building - ich brauche letzteres.. verstehe nicht warum es nur die 3 ersten gibt...
Oh 😂... Ja, ich bin ziemlich neu in Python. Aber irgendwie funktioniert es immernoch nicht richtig...