Koordinaten verknüpfen

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.
Antworten
nil-le
User
Beiträge: 5
Registriert: Montag 16. November 2015, 11:13

Hallo, ich habe über die Sufu leider nichts passendes gefunden.
Ich sitze derzeit an einer Aufgabe in der ich eine Funktion schreiben muss die zu einem bekannten Namen die Wohnkoordinaten herrausgeben soll.
Namen sowie Koordinaten sind bereits eingefügt, allerdings komme ich jetzt nicht weiter, kann mir jemand weiterhelfen?
LG, nil-le 8)
Benutzeravatar
bwbg
User
Beiträge: 407
Registriert: Mittwoch 23. Januar 2008, 13:35

Mit was kommst Du denn nicht weiter? Füge Deinen Quelltext ein, welchen Du schon hast (Code-Tags verwenden!) und ggf. Fehlermeldungen (komplett, auch Code-Tags) und dann sehen wir weiter.
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"
nil-le
User
Beiträge: 5
Registriert: Montag 16. November 2015, 11:13

Also, ich habe folgende Eingaben vorhanden:
Namen = ['Max Mustermann', 'Christian Kerckhoff', 'Maximilian Poschhof', 'Stefan Pape', 'Tanja Safran', 'Marco', 'Julia Mähner', 'josch', 'Michael Sundermann',
'Laura', 'alex', 'Christian Lipowski', 'Miriam E.', 'Dude', 'Danni', 'Michael Jackson', 'Mr.Right', 'Karl A.', 'Bud Spencer', 'Lese', 'Helene Fischer',
'J.S.', 'boris buschbaum', 'Chämeleon', 'Guybrush Threepwood', 'Jonas', 'Isa Krb ', 'Bruce Wayne', 'Reiner Zufall', 'Mr. Nice guy', 'Sananee.sahin',
'David Schneider', 'Thorsten', 'Timbaland', 'Bob Lee Swagger', 'Luisa Rüdiger', 'Olsen', 'Alex Krbg', 'Lukste', 'Melman das Zebra', 'Isa', 'Dan', 'nicull',
'Thiwed', 'D.F.S', 'Marv', 'Alex-Struppi', 'Daishy Wachs', 'Jonny', 'Samy', 'Bob Braumeister', 'Sybille', 'Haras', 'Jack', 'DoGu', 'Bella Ko', 'DeKan',
'Peter Pan', 'Caesar', 'Jimi', 'Haramboy', 'Amy', 'Moritz Fiege', 'DDC', 'Dani', 'SonGoku', 'Paula Schuhmacher', 'Sebastian Dietrich', 'Anna-Lena Röttger',
'Hüseyin', 'E Dzeko', 'Chris Pruin', 'Fabian', 'Chris', 'Chrissi', 'Basti', 'Money Boy', 'Katharina K.', 'Dieter Pete', 'Nunni', 'Borussia', 'Tanja Schneider',
'Furkan', 'Manu', 'PatG', 'Peter Griffin', 'Lina Jay', 'holger', 'Marius', 'Kan', 'Sine Nomine', 'Locke uA', 'Wowa', 'Gollum', 'DerApotheker', 'Mrs Nobody',
'Mia', 'Tomaz Tornando', 'der trinker', 'Jenni', 'Jihyun', 'Tommy Tom', 'Küfürgibi', 'OK', 'z', 'Amy', 'xy=0', 'Zukowski Bau GmbH', 'Vegeta', 'Cihan',
'Heimchen', 'Laura', 'Lenzo', 'Josip', 'Bobby', 'JuWu', 'Bla', 'Zagreb', 'Pascal 34', 'Christian Paul']
Länge = [7.438592, 7.106076, 7.122622, 7.420701, 7.275836, 7.222386, 7.25634, 6.8113092, 7.293886, 6.967042, 7.14473, 7.280276, 7.140136, 7.493273, 7.57897,
7.29615, 5.8530687, 7.216658, 7.006594, 7.454421, 7.45212, 7.01688, 7.13303, 7.0196621, 6.900038, 7.162139, 7.37467, 6.97121, 6.7635, 7.255731, 7.064966,
7.173488, 6.904891, 7.592981, 7.251027, 7.259356, 7.1912682, 6.564468, 7.2874387, 7.179005, 7.255741, 7.47992, 7.17649, 7.234196, 7.411604, 7.119567,
7.184509, 7.219117, 7.522642, 7.194911, 7.217025, 7.163442, 7.174391, 7.056442, 7.3233, 6.57194, 6.688669, 7.225666, 6.839167, 6.709804, 7.051683, 7.26195,
7.226748, 7.215333, 6.763193, 7.273223, 6.626333, 7.41348, 7.803465, 7.220289, 6.519896, 7.4716222, 7.366693, 7.274271, 7.139847, 7.16129, 7.14342, 7.125774,
7.0837724, 7.25623, 7.183489, 8.173958, 7.272209999999973, 7.19223, 7.393841, 7.453223, 7.211909999999989, 7.0241295, 7.268359, 7.300833, 6.72711, 7.1654213,
7.2523674, 7.237346, 7.023168, 7.203033, 7.424559, 7.12991, 7.249464, 7.3629897, 7.144198, 7.142625, 6.76876, 7.217456, 7.08657, 7.1261175, 7.24432, 6.52866,
6.988282, 7.234479, 7.247621, 6.6925223, 7.2222726, 6.555871, 7.178425, 7.188519, 7.0525481, 7.400114, 7.0878576, 7.211469]
Breite = [51.502334, 51.613752, 51.580789, 51.35451, 51.599345, 51.536207, 51.447497, 51.219432, 51.287467, 51.440309, 51.481498, 51.443738, 51.588708, 51.365705,
51.454474, 51.463184, 51.8157895, 51.44132, 51.397678, 51.603513, 51.491719, 51.340707, 51.45639, 51.4405088, 51.520226, 51.537143, 51.373298, 51.529026,
52.0652, 51.447462, 50.886249, 51.385371, 51.576054, 51.221159, 51.450545, 51.453402, 51.492348, 51.437567, 51.4996726, 51.519587, 51.447552, 51.54157,
51.52737, 51.448837, 51.506036, 51.494864, 51.541959, 51.611101, 51.446666, 51.609205, 51.435321, 51.107644, 51.510934, 51.32916, 51.44696, 51.33004,
51.603684, 51.522317, 51.895653, 51.450269, 51.485441, 51.45613, 51.480996, 51.54633, 51.531616, 51.416401, 51.390621, 51.612429, 51.50529, 51.619913,
51.492556, 51.5159947, 51.447987, 51.458997, 51.497322, 51.43787, 51.44157, 51.002999, 51.4236642, 51.44741, 51.564963, 51.587869, 51.64001, 51.442377,
51.567758, 51.51078, 51.49078, 51.5377178, 51.454573, 51.479279, 51.563688, 51.51451, 51.4577942, 51.466062, 51.455197, 51.28154, 51.358348, 51.249159,
51.47538, 51.450378, 51.607577, 51.260465, 51.373821, 51.535222, 51.6021, 51.2504822, 51.45204, 51.5007, 51.329901, 51.495359, 51.479247, 51.8211011,
51.1292474, 51.443909, 51.51614, 51.496418, 51.2619478, 51.335956, 51.5529164, 51.2655866]
Daraus soll ich nun eine Funktion Koordinaten(Person) erstellen, welche zu einem bekanten Namen die dazugehörenden Koordinaten ausgibt.
Also quasi so: Max Mustermann 7.438592,51.502334.
Ich habe es nun schon mit verschachtelten Schleifen probiert, aber irgendwo muss ein dummer Denkfehler bei mir vorlegen.
Btw. Ich bin Python Neuling, habe kaum Erfahrung sammeln können.
Benutzeravatar
bwbg
User
Beiträge: 407
Registriert: Mittwoch 23. Januar 2008, 13:35

Ach du meine Güte :shock:

Grundsätzlich gilt: Es bleibt zusammen, was zusammen gehört! So solltest Du nicht drei Listen haben, sondern genau eine Liste mit Tupeln:

Code: Alles auswählen

personen = [
    ('Max Mustermann', 7.123000, 51.543210),
    ('Wer auch immer', 7.321000, 51.642864),
    ('Noch so einer', 7.235711, 51.117532),
    # etc.
]
Wenn die Namen eindeutig sind, bietet sich ein dictionary an:

Code: Alles auswählen

personen = {
    'Max Mustermann': (7.123000, 51.543210),
    'Wer auch immer': (7.321000, 51.642864),
    'Noch so einer': (7.235711, 51.117532),
    # etc.
}
Die Suche nach den Koordinaten würde so trivial. Eine gesonderte Funktion bräuchtest Du nicht mehr, da das dictionary-object eine entsprechende Methode mitbringt. Welche das ist, überlasse ich Deinem Suchtalent (http://www.python.org) ist Dein Freund.
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@nil-le: Deine Problembeschreibung ist unvollständig. Es muss dir klar sein, dass die Elemente der Listen indexweise zusammengehören. Mit dieser Information könnte ein einfacher Algorithmus zur linearen Suche ungefähr so aussehen:

Gehe durch die Liste Namen und vergleiche jedes Element mit dem Suchbegriff. Lass gleichzeiting einen Zähler mitlaufen, der nach jedem Vergleich um eins erhöht wird. Sobald ein Vergleich True ergibt, wurde der Suchbegriff gefunden und im Zähler steht der Index der gesuchten Koordinaten, mit dem man auf die zugeordneten Elemente der anderen Liste zugreifen kann.

In Python würde man allerdings gleich zip() verwenden, dann bekommt man die Zuordnung geschenkt ohne den Umweg über einen Zähler gehen zu müssen. Zur Veranschaulichung sollte man es dennoch wenigstens einmal im Leben mit Zähler implementiert haben.
In specifications, Murphy's Law supersedes Ohm's.
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@bwbg: Es ist offensichtlich eine Hausaufgabe, die genauso gestellt wurde. Da hilt es nichts, zu sagen, die Hausaufgabe soll doch bitte eine andere sein.
In specifications, Murphy's Law supersedes Ohm's.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@pillmuncher: aus der Problembeschreibung geht nicht klar hervor, ob die Daten schon als Listen vorliegen, oder ob der OP sie aus einer CSV-Datei ungünstig eingelesen hat. So oder so, ist der erste Schritt, sie in ein sinnvolles Datenformat umzuwandeln, entweder, in dem man sie gleich von Anfang an richtig aus einer Datei liest, oder sie aus den gegebenen Listen zusammezippt.
nil-le
User
Beiträge: 5
Registriert: Montag 16. November 2015, 11:13

Die Listen sind tatsächlich genau so vorgegeben.
Als Output soll dann quasi:

Code: Alles auswählen

>>>Koordinaten("Max Mustermann")
(7.438592, 51.502334)
herauskommen, auch das ist so vorgegeben.
Da ich nun leider noch mit Grippe im Bett liege kann ich auch nicht mehr die Übungsstunde besuchen.
Gibt es da vielleicht eine ganz einfache Lösung?(War bisher bei den anderen Aufgaben auch immer ziemlich simpel) :?
BlackJack

@nil-le: Die `zip()`-Funktion wurde ja schon erwähnt. Damit kann man die jeweiligen zusammengehörigen Werte zusammenfassen. Und dann in ein Wörterbuch stecken (`dict`-Datentyp) und von dort dann mit einer Funktion abfragen. Im Grunde ist das ein Einzeiler:
[codebox=python file=Unbenannt.txt]>>> Koordinaten = dict(zip(Namen, zip(Laenge, Breite))).__getitem__
>>> Koordinaten('Max Mustermann')
(7.438592, 51.502334)[/code]
:-)
nil-le
User
Beiträge: 5
Registriert: Montag 16. November 2015, 11:13

Habe es nun wie folgt gemacht, allerdings passiert bei "Run Moudle" nichts. :x

Code: Alles auswählen

from math import sqrt
Name=['Max Mustermann', 'rebher', 'Verthys', 'Maurice', 'Jonas Fischer',
'ysf ed', 'Bubi', 'Hans Schmidt', 'Lusi', 'Ana',
'pink', 'D. Ace', 'Heisenberg', 'Mountain Man', 'erktan',
'Lord of War', 'Lana', 'Charlie', 'SonGoku', 'DomSch',
'Tamagotchi', 'DD', 'Lorenor zoro', 'Eva Terpelle', 'Olaf',
'Thor', 'Dr. Rufus', 'Enrage', 'King BOB', 'Jan',
'Ronny', 'Matze', 'Tobi', 'Lucy', 'Hans Sarpei',
'Tom Brady', 'Basti', 'Einmalig', 'Aufkopfklopf', 'ff',
'Mine 1', 'Mine2', 'Mine 3', 'Mine 4', 'Sasa',
'Jona', 'Urfaliyim Ezelden', 'Istanbul34', 'Diyarbekir21', 'Erzurumlu25',
'Izmit41', 'Sinop57', 'Fluffy', 'Evel Knievel', 'Eddie',
'Whup', 'T.I', 'Alphakevin', 'Kayseri38', 'Lumpi',
'yarak31', 'Izak', 'Tim', 'KevJun', 'Backstreetboy',
'Nico van Hove', 'Jan Marquardt', 'Drn', 'Alice Schwarzer', 'Jack the Ripper',
'Mega Newton Peter', 'Gillete Abdi', 'Haftbefehl', 'KOllegah', 'Erzincan24',
'ebkgjnkrnbi', 'aleber', 'Obergefreiter Mr.J', 'Niru Si', 'Y12Cak',
'dinarA', 'RobZen', 'Asator', 'Absolu', 'PoloAhmed',
'LuckyD', 'Jens', 'Miki', 'Jürgen K', 'Rambo Ramon Rainer',
'BeBu', 'Hanelore', 'Jar Jar Binks', 'Pikachu', '12Bing',
'DerKaiser', 'dav', 'Dan']
Länge=[7.438592, 8.163211, 7.128148, 7.235703, 7.485981,
7.220526, 6.980906, 6.70905, 7.271595, 6.999275,
7.245878, 7.027833, 7.357141, 7.203655, 7.139097,
7.249643, 7.095681, 7.271504, 7.447729, 7.292573,
7.216381, 7.194277, 7.259299, 7.242493, 7.24998,
7.225087, 6.91226, 7.322302, 6.901581, 6.53213,
7.192518, 7.498191, 7.360274, 6.985135, 7.205621,
7.205621, 7.277813, 7.923743, 7.347387, 7.08002,
7.216216, 7.085519, 7.179531, 7.27146, 7.283692,
7.252785, 7.270641, 7.038797, 6.56847, 7.167267,
7.460327, 6.68893, 7.294689, 7.421376, 7.69473,
7.31924, 6.678621, 7.463284, 7.464686, 6.820917,
7.078737, 7.40763, 7.225485, 7.43163, 7.373071,
7.41057, 8.484192, 7.507244, 7.18064, 7.243206,
7.212272, 7.162206, 7.316447, 7.181474, 7.005621,
7.2676, 7.198835, 7.405665, 7.194304, 7.022351,
7.258887, 6.930905, 7.309098, 7.01234, 7.752374,
7.655882, 7.033271, 7.551966, 7.275769, 7.415606,
7.480086, 13.404954, 7.21235, 7.568374, 7.102075,
7.202523, 7.364639, 7.477731]
Breite=[51.502334, 51.589904, 51.532548, 51.438634, 51.5581,
51.285256, 51.668344, 51.537347, 51.155148, 51.57417,
51.469167, 51.49466, 51.208106, 51.490429, 51.252543,
51.370732, 51.420275, 51.457698, 51.519475, 51.41745,
51.476716, 51.535951, 51.455088, 51.476606, 51.528232,
51.571635, 51.442391, 51.476164, 51.524294, 51.49578,
51.49116, 51.485867, 51.486153, 51.44614, 51.544813,
51.544813, 51.443215, 51.765047, 51.400163, 51.49203,
51.534524, 51.46784, 51.44776, 51.55203, 51.32874,
51.468459, 51.447076, 51.3461, 51.30931, 51.256225,
51.353325, 51.461405, 51.427002, 51.349929, 51.59947,
51.52205, 51.596962, 51.367078, 51.521198, 51.242265,
51.511417, 51.619842, 51.447155, 51.54977, 51.51553,
51.317352, 51.888359, 51.558591, 51.612929, 51.447427,
51.49104, 51.296771, 51.517506, 51.467811, 51.522504,
51.455239, 51.409697, 51.613681, 51.272307, 51.532217,
51.447867, 51.187807, 51.696491, 51.672098, 51.690849,
51.620407, 51.278401, 51.485446, 51.828407, 51.470666,
51.521444, 52.520007, 51.485567, 51.359961, 51.443726,
51.463527, 51.514904, 51.54157]

n=len(Name)
def Koordinaten(Person):
    if Person in Name:
        i=Name.index(Person)
        L=Länge[i]
        B=Breite[i]
        return (L,B)
    else:
        return(0,0)
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@nil-le: gewöhn Dir gleich an, Daten, die Du bekommst, in ein vernünftiges Format zu bringen, hier also ein Wörterbuch. Arbeite mit expliziten Indizes nur, wenn es absolut keine andere Lösung gibt, denn Indizes sind umständlicher zu lesen, damit fehleranfälliger, und meist deutlich langsamer. n wird nicht gebraucht. Gewöhn Dir gleich an, alle Namen in der üblichen Konvention zu schreiben. Variablen und Funktionen werden klein geschrieben, Klassennamen mit großem Anfangsbuchstaben und Konstanten KOMPLETT_GROSS. Alle Variablen, die in einer Funktion gebraucht werden, betreten sie über Parameter und verlassen sie über Rückgabewerte. Die korrekte Signatur wäre also: def Koordinaten(Name, Länge, Breite, Person)

Was erwartest Du als Ausgabe?
BlackJack

@nil-le: Was sollte denn Deiner Meinung nach passieren und warum und welche Zeilen werden dafür dass das was Du erwartest abgearbeitet? Das *nichts* passiert ist so ja auch nicht richtig — es werden drei Listen, ein Zahlenwert, und eine Funktion in dem Modul definiert.

Zusatzfragen: Warum wird `sqrt()` aus dem `math`-Modul importiert? Warum/Wofür wird `n` auf Modulebene definiert?

Wahrscheinlich hattet ihr noch keine Ausnahmebehandlung, aber ich weise trotzdem schon mal darauf hin das der ``if Person in Name:``-Test eher „unpythonisch“ ist und auch bei dieser sowieso schon ineffizienten Lösung des linearen Suchens in einer Liste nochmal einen weiteren ineffizienten Suchschritt hinzufügt. Der Test ob `Person` in `Name` enthalten ist, steckt in dem `index()`-Aufruf ja schon mit drin. Falls der Name enthalten ist, dann gibt der Aufruf den Index des Namens in der Liste zurück, und falls nicht, gibt es eine Ausnahme die man entspreched behandeln kann.

Die (leider vorgegebene) Namen sind schlecht gewählt, was man sehr schön sieht wenn man diesen ``if``-Test liest. Was soll denn das bedeuten das *eine* Person in *einem* Namen enthalten ist? Es ist ja nicht *ein* Name, aber es liest sich so. Darum gibt man Werten von Containertypen wie Listen normalerweise einen Namen der die Mehrzahl der Bedeutung eines einzelnen Elements ausdrückt, also in diesem Fall `Namen`, `Laengen`, und `Breiten`, denn hinter diesen Namen verbergen sich ja auch Namen und nicht ein Name, Längen und nicht eine Länge, und Breiten und nicht eine Breite. Dann könnte man das Argument für die Koordinaten-Funktion auch passender `Name` nennen, denn unter einer `Person` stelle ich mir mehr vor als nur den Namen, insbesondere wenn es ja noch mehr Informationen zu der Person im Programm gibt als nur den Namen. Hier die Koordinaten.

In Python würde man diesen (ineffizienten!) Ansatz dann so formulieren:

Code: Alles auswählen

def koordinaten(name):
    try:
        index = NAMEN.index(name)
    except ValueError:
        return (0, 0)
    else:
        return (LAENGEN[index], BREITEN[index])
Die Namensschreibweisen halten sich hier an den Style Guide for Python Code. Den sollte mal jemand dem Lehrer oder Dozenten nahelegen. :-)

Ist der Rückgabewert für Namen die nicht existieren so vorgebeben? Wie unterscheidet man denn als Aufrufer ob jemand wirklich an den Koordinaten (0, 0) wohnt von dem Fall das der Name nicht existiert? Das ist keine gute API.
Antworten