Einen input() weiterverarbeiten => Slice ...

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
lakeck
User
Beiträge: 25
Registriert: Dienstag 20. April 2004, 16:19

Moin Moin,

ich möchte einen Integer nach Eingabe über Tastatur zerlegen, um
mit den einzelnen Ziffern Berechnungen anzustellen.
Ich dachte mir:

Code: Alles auswählen

print "Bitte Zahl eingeben:"
eingabe = input()
t1 = eingabe[0]
t2 = eingabe[1]
...

Error:
t1 = eingabe[0]
TypeError: unsubscriptable object
Ich dachte mir, dass ich die einzelnen Ziffern, 1 bis ... als t1 definiere um damit weiter zu arbeiten, aber das funzt so net.

Für jeden Tip dankbar,
Lakeck
fs111
User
Beiträge: 170
Registriert: Samstag 15. November 2003, 11:42
Kontaktdaten:

input liefert einen integer-Wert, auf diesem ist kein Slicing möglich. Also entweder du konvertierst ihn nach String, oder Du nimmst raw_input, das liefert gleich einen String.

Code: Alles auswählen

>>> a = input()
12345
>>> type(a)
<type 'int'>
>>> a = raw_input()
12345
>>> type(a)
<type 'str'>
>>>            
HTH

Grüße fs111
Pydoc-Integration in vim - Feedback willkommen: http://www.vim.org/scripts/script.php?script_id=910
lakeck
User
Beiträge: 25
Registriert: Dienstag 20. April 2004, 16:19

... aber ein wenig "strong" ist das ja schon !!!

ich importiere nun "raw_imput() .. dann slice(en), dann konvertiere zu int() ... berechne .. das Zwischenergebnis konvertieren als str() ... dann wieder.. slice, dann wieder int() ...

Oder sollte ich mich statt "splice" mal in "split" o.ä. einlesen ..??

Für jeden Tip dankbar,
Lakeck
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Wo genau ist denn das Problem?

Du kannst doch einfach mit raw_input() einlesen und dann weiterverarbeiten, wie von fs111 geschrieben:

Code: Alles auswählen

a = raw_input()
# und dann z.B.:
for x in a:
    mache was mit int(x)

#oder, Du kannst auch jede Ziffer eine Position in einer Liste zuweisen,
#damit Du anschliessend mit t[0], t[1] ... t[n] arbeiten kannst:
t = []
for x in a:
    t.append(int(x))
Na, der zweite Teil ginge auch als Einzeiler, aber zunaechst einmal sollte das doch dem entsprechen was Du suchst, oder?

Deinen zweiten Post allerdings verstehe ich nicht: Wieso willst Du wieder zurueckkonvertieren? Vielleicht magst Du nochmal genauer schreiben, was Du eigentlich machen willst?

Gruss,
Christian
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hi,

oder auch gleich so:

Code: Alles auswählen

a = raw_input("Zahl eingeben: ")
l = list(a) # l ist eine Liste mit den Zeichen aus a
print l
li = [int(x) for x in l] # li ist eine Liste mit Integern statt Zeichen
print li

Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
lakeck
User
Beiträge: 25
Registriert: Dienstag 20. April 2004, 16:19

Ich bekomme das ja hin, was ich vorhabe, aber das geht bestimmt viel,
viel eleganter (aber bin noch Newbie).
---
Oje, bis ich das erklärt habe, habe ich hier bestimmt einen halben
Roman geschrieben, also schonmal -Sorry- vorab.

O.K. Ich habe eine 11-stellige Zahlenfolge, wo ich eine "Prüfziffer"
berechnen will (12. Stelle).
Diese Prüfziffer berechnet sich nach Modulo-10 / Basis 3 1 3 1 ...

Bsp.: die Zahl 12345678901p

1 * 3 = 3
2 * 1 = 2
3 * 3 = 9
4 * 1 = 4
5 * 3 = 15
6 * 1 = 6
7 * 3 = 21
8 * 1 = 8
9 * 3 = 27
0 * 1 = 0
1 * 3 = 3
-----
Summe: 98 / nächste Zehnerstelle = 100 / Prüfziffer (Differenz) = 2

Ich bin dann so daran gegangen (Newbie):

Code: Alles auswählen

print "Bitte Zahl eingeben:"
eingabe = raw_input()
t1 = eingabe[0] 
t2 = eingabe[1]
t3 = eingabe[2]
t4 = eingabe[3]
t5 = eingabe[4]
t6 = eingabe[5]
t7 = eingabe[6]
t8 = eingabe[7]
t9 = eingabe[8]
t10 = eingabe[9]
t11 = eingabe[10]
t1 = int(t1)
t2 = int(t2)
t3 = int(t3)
t4 = int(t4)
t5 = int(t5)
t6 = int(t6)
t7 = int(t7)
t8 = int(t8)
t9 = int(t9)
t10 = int(t10)
t11 = int(t11)
zwi = t1*3 + t2*1 + t3*3 + t4*1 + t5*3 + t6*1 + t7*3 + t8*1 +t9*3 + t10*1 + t11*3
print zwi
zwi = str(zwi)
erg = zwi[-1]
erg = int(erg)
ziffer = 10 - erg

print "Die Zahl lautete:" ,eingabe
print "Die Pruefziffer lautet:" ,ziffer
Ihr seht, wie ich da am rumkrampfen bin mit str > int > str deswegen mein 2. Posting ...
Puuuh ...
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

jo geht wirklich einfacher und kürzer :)

Code: Alles auswählen

eingabe = raw_input("Bitte Zahl eingeben:\n")
psum = 10 - sum([int(eingabe[i]) * (3, 1)[i & 1] for i in xrange(len(eingabe))]) % 10
print "Die Zahl lautete:", eingabe
print "Die Pruefziffer lautet:", psum
Hier nutze ich ein paar Spezialitäten von Python und auch einen "Trick 17" ;)

raw_input erlaubt auch einen Parameter, welcher vor der Eingabe auf der Console ausgegeben wird.

[int(e) for e in eingabe] würde eine Liste erzeugen mit den Ziffern umgewandelt in Integer. Da Wir aber mit den Ziffern in Abhängigkeit von der Position eine Berechnung machen wollen bietet es sich an, nicht direkt über "eingabe" zu iterieren sondern auf die Ziffern in "eingabe" mittels eines Iterators für den Index zuzugreifen, da wir den Index auch für die Berechnung sehr gut brauchen können.

[int(eingabe) for i in xrange(len(eingabe))] entspricht dem vorherigen Konstrukt, hier können wir aber mit den Ziffern und der Stelle, an der die Ziffer steht noch eine Berechnung einfügen

(3, 1)[i & 1] ist nun "Trick 17". i bestimmt die Stelle(Position) der Ziffer und Abhängig davon ob die Positon geradzahlig (0, 2, 4, 6, 8, 10) oder ungeradzahlig (1, 3, 5, 7, 9) ist soll mit 3 oder 1 Multipliziert werden. Ob i geradzahlig ist, kann durch ein binäres & mit 1 getestet werden, i & 1 ergibt bei gerader Zahl 0 und bei ungeraden 1, dies kann man als Index für ein Tuple (3, 1) verwenden. Ist i gerade, ergibt (3, 1)[i & 1] 3 sonst 1.
Kleiner Tipp: Sowas lässt sich wunderbar in der Pythonconsole austüfteln:

Code: Alles auswählen

>>> print (3, 1)[5 & 1]
1

>>> print (3, 1)[6 & 1]
3

>>> print (3, 1)[8 & 1]
3

>>> print (3, 1)[3 & 1]
1
[int(eingabe) * (3, 1)[i & 1] for i in xrange(len(eingabe))] erstellt eine Liste mit den Berechneten Stellen.

sum(...) zählt einfach die Einträge einer Liste zusammen, so erhalten wir die Summe der berechneten Werte.
Der Rest ist dann einfache Berechnung mit dem Modulooperator %.


Gruß

Dookie
edit: ein [/b] ausgebessert
Zuletzt geändert von Dookie am Dienstag 12. Oktober 2004, 18:46, insgesamt 1-mal geändert.
[code]#!/usr/bin/env python
import this[/code]
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Hi!

@Dookie:
Ich geb ja so etwas ungern zu (es fällt mir auch jetzt schwer :D), aber ich bin beeindruckt :shock:
Hab auch ein wenig herumgetüftelt. Naja, ein Einzeiler ist mir nicht gelungen, aber es funktioniert (zumindest glaube ich das :wink:):

Code: Alles auswählen

eingabe = raw_input("Zahl")
t = [int(i) for i in eingabe]
zwi = 0
for i in range(len(t)):
	zwi += t[i]*(3,1)[i%2]   # nicht so cool wie [i & 1]
print zwi
ziffer = 10-int(str(zwi)[-1])
print ziffer
Gruß, mawe
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Hi. Statt dem binärem Test könnte man natürlich auch den Test mit modulo 2 machen: (3, 1)[i % 2], was zwar nicht so effizient wäre, aber in dem Fall ein wenig deutlicher. Ansonsten gute Arbeit Dookie :D . Nehmts mir nicht übel, aber ich verstehe den Code schneller, als die Problembeschreibung und hab deswegen nix geschrieben :oops: .

mfg Milan
lakeck
User
Beiträge: 25
Registriert: Dienstag 20. April 2004, 16:19

Und nun stellt euch mal vor, wie beindruckt ich da erst sein muss !!

Wenn sogar schon die anderen Experten dem Dookie Respekt zollen !!
Hut ab !!
Aber ob ich das jemals kapiere .... ich wage es ja zu bezweifeln :cry:

@Milan
An meiner Problembeschreibung muss ich dann wohl zukünftig noch
arbeiten !!

So, jetzt bin ich ja mal gespannt, ob das wirklich funktioniert, muss ich
gleich mal ausprobieren.


Habt 1000 Dank !!
Lakeck
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hi lakeck,

och das wird schon, wenn man einmal die Grundkonzepte einer Sprache, hier z.B. die Listcomprehensions verstanden hat und dann noch gerne mit lambdas (wo man auch, wegen gewisser Einschränkungen tricksen muss) arbeitet, kommt man dann auch auf solche Lösungen.


Gruß

Dookie

P.S.: an alle, danke für die Blumen :D
[code]#!/usr/bin/env python
import this[/code]
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Hi!
lakeck hat geschrieben: Aber ob ich das jemals kapiere .... ich wage es ja zu bezweifeln
Wird schon :wink:. Schau Dir vielleicht vorher meine Lösung an (Schleichwerbung :D). Ist vom Prinzip her (ungefähr) das selbe, nur in mehreren Schritten.

Gruß, mawe
lakeck
User
Beiträge: 25
Registriert: Dienstag 20. April 2004, 16:19

Moin Dookie,

naja, jeder fängt mal mit ganz kleinen Schritten an.
Aber für mich ist das natürlich "brutal", was du mir da in die Hände gibst.

Aber mühsam ernährt sich ja bekanntlich das Eichhörnchen ...
Und -learning bei doing- mit den "Aha-Effekten" merkt man sich noch
immer am Besten.

Ich habe gelernt, das man Integer nicht 'slicen' kann und das man statt mit 30 Zeilen Code auch mit 3 Zeilen auskommen kann (wenn man clever ist). :wink:

Wie lange bist du schon am programmieren ??
Machst du das auch beruflich ??

Gruß
Lakeck
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Meine Anfänge mit der Programmierung, auf einem C64 mit Basic, liegen auch schon etwa 20 Jahre zurück und seit 14 Jahren mach ich das auch beruflich, habs aber nicht studiert.
Python hab ich vor etwa 3 Jahren entdeckt und bin immer noch begeistert :)


Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
Antworten