Überlappungs-Koeffizienten berechnen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Chilla258
User
Beiträge: 16
Registriert: Sonntag 30. Dezember 2012, 22:18

Hallo ihr Lieben :D ,

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....
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Was genau sind denn "Überlappungskoeffizienten"? Und wie sind "ähnliche" Paare definiert?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
pixewakb
User
Beiträge: 1412
Registriert: Sonntag 24. April 2011, 19:43

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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
snafu
User
Beiträge: 6744
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Geht auch noch kürzer/direkter:

Code: Alles auswählen

sum(a == b for a, b in data) / len(data)
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.
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

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
Benutzeravatar
snafu
User
Beiträge: 6744
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Entweder so, oder durch ein vorheriges

Code: Alles auswählen

from __future__ import division
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.
Benutzeravatar
pixewakb
User
Beiträge: 1412
Registriert: Sonntag 24. April 2011, 19:43

Das sieht für mich beides nach list comprehension aus?

Code: Alles auswählen

 sum(1 for a, b in data if a == b) / len(data)

Code: Alles auswählen

sum(a == b for a, b in data) / len(data)
Wo finde ich das im Tutorial? "Intuitiv" erschließen sich mir beide Zeilen nicht (mehr).

Ist das ein Generator???
nezzcarth
User
Beiträge: 1638
Registriert: Samstag 16. April 2011, 12:47

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
Chilla258
User
Beiträge: 16
Registriert: Sonntag 30. Dezember 2012, 22:18

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
JonasR
User
Beiträge: 251
Registriert: Mittwoch 12. Mai 2010, 13:59

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?
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

snafu hat geschrieben:Geht auch noch kürzer/direkter:

Code: Alles auswählen

sum(a == b for a, b in data) / len(data)
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.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

derdon hat geschrieben:
snafu hat geschrieben:Geht auch noch kürzer/direkter:

Code: Alles auswählen

sum(a == b for a, b in data) / len(data)
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.
Das Leben ist wie ein Tennisball.
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. :-)
Benutzeravatar
snafu
User
Beiträge: 6744
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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.
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
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

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? :)
lunar

@kbr Wie wäre es mit: „Selbstständig denken und eine eigene Entscheidung treffen?“ :)
Antworten