Seite 1 von 1
Listen in int umwandeln
Verfasst: Mittwoch 6. Juli 2011, 12:40
von bremer
Strings usw. sollen dennoch mitgenommen werden.
Code: Alles auswählen
Python 3.1.2
>>> l = ["5", "3", "10", "string"]
>>> new_list = [int(slot) for slot in data]
>>> new_list
[5, 3, 10]
A big "**** ***" to Python! Nicht ein mal ein Fehler wird ausgeworfen.
Code: Alles auswählen
>>> l
['5', '3', '10', 'string']
>>> new_list = filter(int, l)
>>> m = [element for element in new_list]
Traceback (most recent call last):
File "<pyshell#62>", line 1, in <module>
m = [element for element in new_list]
File "<pyshell#62>", line 1, in <listcomp>
m = [element for element in new_list]
ValueError: invalid literal for int() with base 10: 'string'
>>> m
[3, 5, 10]
Ich dachte die Filterfunktion funktioniert eh nur, wenn sie True erhält.
Code: Alles auswählen
>>> for element in l:
try:
element = int(element)
except ValueError:
pass
>>> l
['5', '3', '10', 'string']
Cool, es passiert gar nichts. Ich nahm wirklich an, dass sei in Python ganz einfach. Vielleicht bin ich zu naiv.
Code: Alles auswählen
>>> data
['5', '3', '10', 'string']
>>> new_data = []
>>> for slot in data:
try:
new_data.append(int(slot))
except ValueError:
new_data.append(slot)
>>> new_data
[5, 3, 10, 'string']
WAHNSINN! Ich habe auch Code mit type() ausprobiert, was zu nichts geführt hat, da type() mittlerweile eine Klasse ausgibt. In einem dictionary wäre ich zunächst aufgeschmissen. Möchte sich jemand an Alternativen versuchen?
Re: Listen in int umwandeln
Verfasst: Mittwoch 6. Juli 2011, 12:49
von EyDu
Hallo.
Zu deinem ersten Beispiel: Wenn du über `l` iterierst und nicht über `data`, dann wird auch ein Fehler geworfen. Genau wie in deinem zweiten Beispiel.
Zu deinem zweiten Beispiel: `filter` übernimmt genau dann ein Element, wenn `func(element)` zu `True` ausgewertet werden kann. Da bei dir `func`=`int` wird versucht einen String in einen Integer zu wandeln, was sofort einen Fehler wirft. Zu einem Vergleich kommt es gar nicht erst. Außerdem hast du ein Problem, wenn du auf einen Eintrag "0" triffst, welchen dann verworfen wird. Du solltest also die Dokumnetation zu `filter` lesen. Vielleicht suchst du auch `map`.
Zum dritten Beispiel: Das kann nicht funktionieren, weil `element` ein lokaler Name ist. Wenn du nicht verstehst warum die Zuweisung nicht funktionniert, dann solltest du noch einmal an deinen Grundlagen arbeiten.
Zum vierten Beispiel: Warum machst du daraus nicht eine Funktion, welche entweder den umgewandelten Wert zurück gibt oder, falls eine Umwandlung nicht möglich ist, den unveränderten. Dann kannst du diese (Funktion) mit einer LC oder `map` verwenden.
Sebastian
Re: Listen in int umwandeln
Verfasst: Mittwoch 6. Juli 2011, 12:55
von deets
Wenn man die Semantik einer Programmiersprache nicht versteht, falsche variablennamen benutzt und generell etwas konfus ist, geraet man offensichtlich leicht ins Fluchen....
Natuerlich schmeisst python einen Fehler, wenn man versucht, strings in int zu wandeln:
Code: Alles auswählen
>>> new_list = [int(slot) for slot in l]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in <listcomp>
ValueError: invalid literal for int() with base 10: 'string'
Wenn man aber in seinem codeschnipsel ein nicht weiter erklaertes "data" verwendet, dass offensichtlich woanders herkommt - dann ist der einzige , dem man "**** ***" zurufen kann der Vor-dem-Keyboard-Sitzer.
Der Rest des ganzen Unsinns folgt dann nur logisch. ZB sich darueber zu wundern, dass man eine Liste, ueber die man iteriert, nicht gleichzeitig auch noch magische mutiert wird. Usw.
Dabei ist es doch soo einfach in Python:
Code: Alles auswählen
l = ["5", "3", "10", "string"]
def p(v):
try:
return int(v)
except ValueError:
return v
print([p(i) for i in l])
Re: Listen in int umwandeln
Verfasst: Mittwoch 6. Juli 2011, 16:48
von Xynon1
@bremer
Ich würde es ja(zumidest wenn man immer Listen hat) gleich so machen:
Code: Alles auswählen
>>> def strint(alist):
... for value in alist:
... try:
... yield int(value)
... except ValueError:
... yield value
...
>>> mylist = ["5", "3", "10", "string"]
>>> list(strint(mylist))
[5, 3, 10, 'string']
Re: Listen in int umwandeln
Verfasst: Mittwoch 6. Juli 2011, 19:50
von hendrikS
Eine filter Alternative:
Code: Alles auswählen
x = ["45", "b4la", "53636","3", "Y"]
filter(lambda s:s.isdigit(),x)
Re: Listen in int umwandeln
Verfasst: Donnerstag 7. Juli 2011, 01:11
von theliquidwave
Code: Alles auswählen
>>> x = ["45", "b4la", "53636","3", "Y"]
>>> map(lambda y: int(y) if y.isdigit() else y, x)
[45, 'b4la', 53636, 3, 'Y']
Re: Listen in int umwandeln
Verfasst: Donnerstag 7. Juli 2011, 08:44
von EyDu
Re: Listen in int umwandeln
Verfasst: Donnerstag 7. Juli 2011, 12:57
von derdon
Weil der Trend zu nur-Code posten übergeht, will ich da auch mal mitmachen:
Re: Listen in int umwandeln
Verfasst: Donnerstag 7. Juli 2011, 16:19
von Barabbas
derdon: Die Kunst liegt natürlich darin, mit dem Code eine Frage zu beantworten, die zuvor gestellt wurde bzw. auf ein Problem hinzuweisen, das mit der Ausgangsfrage in Beziehung steht

.
Re: Listen in int umwandeln
Verfasst: Donnerstag 7. Juli 2011, 16:25
von derdon
Achso, ich dachte hier wär wildes code-posten. Menno!