Matroids Matheplanet Forum Index
Moderiert von matph
Informatik » Programmieren » Python: Menge zu Liste
Autor
Universität/Hochschule Python: Menge zu Liste
Brayn
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 07.09.2014
Mitteilungen: 262
Wohnort: Kaiserslautern
  Themenstart: 2017-08-18

Hi, Angenommen wir haben in Python eine Klasse mit zwei Attributen und nun eine Menge von Objekten dieser Klasse. Gibt es eine bessere Möglichkeit als meine unten angegebene um von dieser Menge eine Liste zu erstellen, die nur die Werte eines bestimmten Attributs enthält? Ich habe mal folgendes Minimalbeispiel erstellt: \sourceon Python class Test_Class: def __init__(self, any_list): self.length = len(any_list) self.first = any_list[0] def __hash__(self): return self.length my_set = set() my_set.add(Test_Class([1,2,3,4,5,6,7,8,9,10])) my_set.add(Test_Class([2,4,6,8,10])) my_set.add(Test_Class([1,3,5,7,9])) my_set_as_list = list() for i in range(0,len(my_set)): my_set_as_list.append(my_set.pop().length) \sourceoff In der letzten for-Schleife iteriere ich nun über alle Objekte der Test_Class, die in der Menge my_set sind und speicher mir in der Liste my_set_as_list nur die Attributwerte von length. Ich würde mit wünschen, dass es eine build-in Funktion gibt, sodass ich nur sowas wie: my_set_as_list = list(my_set.get_all('length')) schreiben muss und die bestenfalls sogar schneller ist. Liebe Grüße Matthias


   Profil
tactac
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 15.10.2014
Mitteilungen: 2185
  Beitrag No.1, eingetragen 2017-08-20

Wie wär's mit: \sourceon Python my_set_as_list = [x.length for x in my_set] \sourceoff Kürzer ist's auf jeden Fall. Mindestens so schnell ist's ziemlich sicher auch. Garantiert schneller nicht unbedingt. Miss.


   Profil
Brayn
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 07.09.2014
Mitteilungen: 262
Wohnort: Kaiserslautern
  Beitrag No.2, vom Themenstarter, eingetragen 2017-08-20

Hallo tactac, vielen Dank :) sowas habe ich gesucht. Liebe Grüße Matthias


   Profil
Wrathchild
Senior Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 09.01.2007
Mitteilungen: 783
  Beitrag No.3, eingetragen 2017-08-23

Bei Klassen, denen man sinnvoll eine Länge zuordnen kann, bietet es sich an, die Methode __len__() zu implementieren: \sourceon Python def __len__(self): return self.length \sourceoff Dann kann man statt der von tactac gezeigten List comprehension auch einfach map(len, my_set) schreiben, denn die eingebaute len-Function tut nicht viel mehr, als die __len__-Methode aufzurufen. __len__ kommt noch an anderer Stelle zum Einsatz, nämlich wenn das Objekt in einem boolschen Kontext (z. B. einer if-Bedingung) verwendet wird. Das Objekt wird als "wahr" betrachtet, wenn die __len__-Methode nicht 0 zurückgibt.


   Profil
Brayn
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 07.09.2014
Mitteilungen: 262
Wohnort: Kaiserslautern
  Beitrag No.4, vom Themenstarter, eingetragen 2017-09-10

Hallo Wrathchild, vielen Dank für deine Ergänzung :) Liebe Grüße Matthias


   Profil
Folgende Antworten hat der Fragesteller vermutlich noch nicht gesehen.
Er/sie war noch nicht wieder auf dem Matheplaneten
__blackjack__
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 23.09.2021
Mitteilungen: 27
  Beitrag No.5, eingetragen 2021-09-27 16:53

@Brayn Ich bin von der `__hash__()`-Methode in dem Minimalbeispiel irritiert, denn die trägt a) nichts zu diesem Beispiel bei, und b) ist es komisch *die* zu implementieren, aber keine passende `__eq__()`-Methode dazu. Wenn man das macht, dann würde das Minimalbeispiel aber auch ein anderes Ergebnis liefern.


   Profil

Wechsel in ein anderes Forum:
 Suchen    
 
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2021 by Matroids Matheplanet
This web site was originally made with PHP-Nuke, a former web portal system written in PHP that seems no longer to be maintained nor supported. PHP-Nuke is Free Software released under the GNU/GPL license.
Ich distanziere mich von rechtswidrigen oder anstößigen Inhalten, die sich trotz aufmerksamer Prüfung hinter hier verwendeten Links verbergen mögen.
Lesen Sie die Nutzungsbedingungen, die Distanzierung, die Datenschutzerklärung und das Impressum.
[Seitenanfang]