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....
Überlappungs-Koeffizienten berechnen
- 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
assert encoding_kapiert
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???
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.
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)]))
- 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
assert encoding_kapiert
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.
Code: Alles auswählen
sum(a == b for a, b in data) / len(data)
Was sich leicht beheben lässt: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.
Code: Alles auswählen
>>> sum(a == b for a, b in data) * 1.0 / len(data)
0.25
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.
Code: Alles auswählen
from __future__ import division
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.
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???
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)
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-1pixewakb hat geschrieben: Ist das ein Generator???
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
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)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
Wieso nimmst du nicht die verkleinerte Lösung?
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
Was noch fehlt: Ist ein Generator Ausdruck das einzige Argument fuer eine Funktion, kann man die Klammern weglassen.pixewakb hat geschrieben:...
Ist das ein Generator???
Die Beispiele lassen die Klammern alle weg und der Fliesstext erwaehnt den Umstand leider nicht:
http://docs.python.org/2/tutorial/class ... xpressions
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
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.snafu hat geschrieben:Geht auch noch kürzer/direkter:Code: Alles auswählen
sum(a == b for a, b in data) / len(data)
Das Verhalten ist garantiert und wird so auch in diversen anderen Sprachen verwendet. Ich kann daran nichts unleserliches erkennen.derdon hat geschrieben: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.snafu hat geschrieben:Geht auch noch kürzer/direkter:Code: Alles auswählen
sum(a == b for a, b in data) / len(data)
Das Leben ist wie ein Tennisball.
@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.
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.
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.
@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…
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…
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?