Listen in int umwandeln

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
bremer
User
Beiträge: 109
Registriert: Sonntag 25. Mai 2008, 00:13

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?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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
Das Leben ist wie ein Tennisball.
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])
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

@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']
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

Eine filter Alternative:

Code: Alles auswählen

x = ["45", "b4la", "53636","3", "Y"]
filter(lambda s:s.isdigit(),x)
theliquidwave
User
Beiträge: 221
Registriert: Sonntag 1. Juni 2008, 09:08

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']
Grüßle.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Code: Alles auswählen

>>> "-42".isdigit()
False
Das Leben ist wie ein Tennisball.
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Weil der Trend zu nur-Code posten übergeht, will ich da auch mal mitmachen:

Code: Alles auswählen

>>> '1.0'.isdigit()
False
>>> int(float('1.0'))
1
Barabbas
User
Beiträge: 349
Registriert: Dienstag 4. März 2008, 14:47

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

Achso, ich dachte hier wär wildes code-posten. Menno!
Antworten