Seite 1 von 2
Überlappungs-Koeffizienten berechnen
Verfasst: Donnerstag 3. Januar 2013, 21:56
von Chilla258
Hallo ihr Lieben

,
folgende aufgabe:
ich habe bereits eine funktion geschrieben, die mir eine liste aus tupeln ausgibt. nun möchte ich, dass meine nächste funktion genau über diese liste iteriert und mir eine art "überlappungs-koeffizienten" berechnet und diese ausgibt.
die funktion soll also die anzahl aller paare mit übereinstimmenden elementen durch die anzahl aller paare dividieren.
das ganze müsste dann später mal so aussehen:
>>> BerechneKoeffizient([(1,2), (3,4), (0,0), (3,2)])
0.25
soweit der plan. wie kriege ich sowas hin?
logischerweise muss meine funktion erstmal über die einzelnen tuple der liste iterieren um rauszufinden welche ähnlich sind. dazu muss sie vermutlich erstmal über die gesamte liste iterieren?!
und anschließend wird dann gerechnet....
Re: Überlappungs-Koeffizienten berechnen
Verfasst: Donnerstag 3. Januar 2013, 22:37
von Hyperion
Was genau sind denn "Überlappungskoeffizienten"? Und wie sind "ähnliche" Paare definiert?
Re: Überlappungs-Koeffizienten berechnen
Verfasst: Donnerstag 3. Januar 2013, 22:42
von pixewakb
Google sagt - Überlappungskoeffizient => qualitative Sozialforschung. Ich überlege gerade, aus welchem Bereich du kommst und ob es sich nicht wahrscheinlich um Informatik-Aufgaben handelt, an denen du scheiterst. Im Augenblick tippe ich darauf, dass du aus dem Bereich "qualitative Sozialforschung" kommst und nachrechnen willst???
Code: Alles auswählen
def BerechneKoeffizient(liste):
''' Berechnet fuer eine Liste mit Tupeln den Ueberlappungs-
Koeffizienten, d. i. Anzahl der Paare mit uebereinstimmenden
Paaren durch Anzahl aller Paare
Testdaten: [(1,2), (3,4), (0,0), (3,2)] -> 0.25
'''
zaehler = 0
for i in liste:
if i[0] == i[1]:
zaehler += 1
return zaehler / len(liste)
print(BerechneKoeffizient([(1,2), (3,4), (0,0), (3,2)]))
Liefert auch für weitere Daten (z. B. print(BerechneKoeffizient([(1,1), (2,2), (2,4), (4,5), (8,9)]))) zutreffende Daten. Möglicherweise solltest du dir mal ein Handbuch oder Tutorial vornehmen. Deine Anfragen hier sind sehr basal. Es fehlen die Grundlagen.
Re: Überlappungs-Koeffizienten berechnen
Verfasst: Donnerstag 3. Januar 2013, 22:48
von Hyperion
Ach so, na das geht auch einfacher:
Code: Alles auswählen
>>> sum(1 for a, b in data if a == b) / len(data)
0.25
Re: Überlappungs-Koeffizienten berechnen
Verfasst: Donnerstag 3. Januar 2013, 22:50
von pixewakb
Re: Überlappungs-Koeffizienten berechnen
Verfasst: Freitag 4. Januar 2013, 09:20
von snafu
Geht auch noch kürzer/direkter:
Zu beachten ist, dass sich die Division mit Ganzzahlen zwischen Python 2 und Python 3 unterscheidet. Das hier erwartete Verhalten würde standardmäßig nur Python 3 liefern.
Re: Überlappungs-Koeffizienten berechnen
Verfasst: Freitag 4. Januar 2013, 09:55
von kbr
snafu hat geschrieben:Zu beachten ist, dass sich die Division mit Ganzzahlen zwischen Python 2 und Python 3 unterscheidet. Das hier erwartete Verhalten würde standardmäßig nur Python 3 liefern.
Was sich leicht beheben lässt:
Code: Alles auswählen
>>> sum(a == b for a, b in data) * 1.0 / len(data)
0.25
Re: Überlappungs-Koeffizienten berechnen
Verfasst: Freitag 4. Januar 2013, 09:58
von snafu
Entweder so, oder durch ein vorheriges
Damit erhält man durchgängig Python-3-"artiges" Divisionsverhalten.
Muss man halt sehen, in welcher Situation man das eine oder das andere bequemer findet...
Ich mag die Variante mit dem Import persönlich lieber, aber ist sicherlich Geschmackssache.
Re: Überlappungs-Koeffizienten berechnen
Verfasst: Freitag 4. Januar 2013, 10:47
von pixewakb
Das sieht für mich beides nach list comprehension aus?
Wo finde ich das im Tutorial? "Intuitiv" erschließen sich mir beide Zeilen nicht (mehr).
Ist das ein Generator???
Re: Überlappungs-Koeffizienten berechnen
Verfasst: Freitag 4. Januar 2013, 12:21
von nezzcarth
pixewakb hat geschrieben:
Ist das ein Generator???
"Generator expressions". Abgesehen von den Python-eigenen Materialien findest du unter dem Schlagwort viele Erklärungen im Netz, z.B. hier:
http://getpython3.com/diveintopython3/a ... ators.html (8.5) oder
http://python.net/~goodger/projects/pyc ... ressions-1
Re: Überlappungs-Koeffizienten berechnen
Verfasst: Freitag 4. Januar 2013, 13:23
von Chilla258
zu beachten wäre allerdings noch, dass die ausgegebene liste einer vorherigen funktion benutzt werden soll. die funktionen werden später in ein programm zusammen geschrieben

es handelt sich hierbei tatsächlich um informatik. mir wurde diese aufgabe gestellt und ich versuche sie nun irgendwie zu lösen, bin jedoch etwas am scheitern, da ich hiervon recht wenig ahnung habe....daher suche ich mir hier hilfe

vielleicht sollte ich noch erwähnen, dass ich python benutze und benutzen muss?! vielleicht ganz hilfreich
@pixewakb: aus irgendeinem grund kommt bei deinem vorschlag folgender fehler:
Traceback (most recent call last):
File "<pyshell#11>", line 1, in <module>
BerechneKoeffizient([(1,2), (3,4) (0,0), (3,2)])
TypeError: 'tuple' object is not callable
Re: Überlappungs-Koeffizienten berechnen
Verfasst: Freitag 4. Januar 2013, 13:32
von JonasR
Chilla258 hat geschrieben:zu beachten wäre allerdings noch, dass die ausgegebene liste einer vorherigen funktion benutzt werden soll. die funktionen werden später in ein programm zusammen geschrieben

es handelt sich hierbei tatsächlich um informatik. mir wurde diese aufgabe gestellt und ich versuche sie nun irgendwie zu lösen, bin jedoch etwas am scheitern, da ich hiervon recht wenig ahnung habe....daher suche ich mir hier hilfe

vielleicht sollte ich noch erwähnen, dass ich python benutze und benutzen muss?! vielleicht ganz hilfreich
@pixewakb: aus irgendeinem grund kommt bei deinem vorschlag folgender fehler:
Traceback (most recent call last):
File "<pyshell#11>", line 1, in <module>
BerechneKoeffizient([(1,2), (3,4) (0,0), (3,2)])
TypeError: 'tuple' object is not callable
Dir fehlt ein Komma zwischen (3,4) und (0, 0)
Wieso nimmst du nicht die verkleinerte Lösung?
Re: Überlappungs-Koeffizienten berechnen
Verfasst: Freitag 4. Januar 2013, 14:13
von cofi
pixewakb hat geschrieben:...
Ist das ein Generator???
Was noch fehlt: Ist ein Generator Ausdruck das einzige Argument fuer eine Funktion, kann man die Klammern weglassen.
Die Beispiele lassen die Klammern alle weg und der Fliesstext erwaehnt den Umstand leider nicht:
http://docs.python.org/2/tutorial/class ... xpressions
Re: Überlappungs-Koeffizienten berechnen
Verfasst: Samstag 5. Januar 2013, 00:35
von derdon
snafu hat geschrieben:Geht auch noch kürzer/direkter:
Das geht allerdings nur, weil bool in Python von int erbt und sich daher True wie 1 und False wie 0 verhält. Ob die Ausnutzung dieser Eigenschaft "clever" ist oder der Code dadurch unleserlicher wird, ist zumindest Geschmackssache. Ich persönlich finde es nicht schön, lauter True- und False-Werte zu addieren.
Re: Überlappungs-Koeffizienten berechnen
Verfasst: Samstag 5. Januar 2013, 10:52
von EyDu
derdon hat geschrieben:snafu hat geschrieben:Geht auch noch kürzer/direkter:
Das geht allerdings nur, weil bool in Python von int erbt und sich daher True wie 1 und False wie 0 verhält. Ob die Ausnutzung dieser Eigenschaft "clever" ist oder der Code dadurch unleserlicher wird, ist zumindest Geschmackssache. Ich persönlich finde es nicht schön, lauter True- und False-Werte zu addieren.
Das Verhalten ist
garantiert und wird so auch in diversen anderen Sprachen verwendet. Ich kann daran nichts unleserliches erkennen.
Re: Überlappungs-Koeffizienten berechnen
Verfasst: Samstag 5. Januar 2013, 11:36
von BlackJack
@EyDu: Das ist so eine Informatikereigenart und wird vor allem von Sprachen verwendet die keinen eigenen Datentyp für Wahrheitswerte haben. Das ist auch der Grund warum es in Python so ist — bevor es `bool` gab musste man sich mit `int`\s behelfen und als `bool` eingeführt wurde, musste man es entweder von `int` ableiten oder mit der Rückwärtskompatibilität brechen weil viel alter Code so etwas wie ``True, False = 0, 1`` gemacht hat.
Auch in den anderen Sprachen wird so etwas in der Regel nicht empfohlen, weil es undurchsichtig ist und den Leser verwirrt, also schwerer lesbar ist. Die einzige Sprache wo ich mich erinnern kann, dass so etwas als guter Stil angesehen wurde ist Forth um ``if``\s zu vermeiden. Aber das ist aus einer anderen Zeit und einer anderen Klasse von Rechnern.

Re: Überlappungs-Koeffizienten berechnen
Verfasst: Samstag 5. Januar 2013, 13:23
von snafu
Da gehen die Meinungen wohl wirklich auseinander. Ich persönlich empfinde es als intuitiv, dass Wahrheitswerte in Python Aliase für ihre numerischen Gegenstücke 0 und 1 sind und daher beliebig ausgetauscht werden können. Ich erkenne auch keinen schlechten Stil dahinter, wenn ich eine Anwendung dieses Verhaltens in Programmcode sehe. Auch denke ich nicht, dass es sich hier primär eine Art "Kompatibilitätskrücke" handelt, sondern sehe das ganze als ein durchaus angenehmes Sprachfeature an.
Re: Überlappungs-Koeffizienten berechnen
Verfasst: Samstag 5. Januar 2013, 13:26
von lunar
@BlackJack Rückwärtskompatibilität zieht nur bedingt als Begründung. In Python 3 sind "True" und "False" Schlüsselwörter, "True, False = 1, 0" mithin ein Syntaxfehler, doch bool ist immer noch eine Kindklasse von "int". „Rechnen“ mit boolschen Werten war also zumindest nicht so schlechter Stil als dass es in Python 3 komplett untersagt worden wäre.
Ich halte es mit EyDu: Mir gefällt die explizite Variante zwar besser, aber das Rechnen mit Wahrheitswerten halte ich nicht für schlechten Stil. Und damit bin ich
nicht alleine…
Re: Überlappungs-Koeffizienten berechnen
Verfasst: Samstag 5. Januar 2013, 14:10
von kbr
Das ist ja fast schon ein Dilemma: Die explizite Variante entspricht dem Zen of Python (was mir gefällt), die kompakte aber ist gemäß der nachvollziehbaren Argumentation von
Alex Martelli sehr wohl pythonisch. Was nun?

Re: Überlappungs-Koeffizienten berechnen
Verfasst: Samstag 5. Januar 2013, 18:17
von lunar
@kbr Wie wäre es mit: „Selbstständig denken und eine eigene Entscheidung treffen?“
