in eine Lösung Fehler einbauen#

Sitzung 2024-01-24

gegeben: eine Lösung

gesucht: eine kaputte Lösung, die man Studierenden zur Reparatur vorlegen kann.

(ja, das ist eine Aufgabe auf einem höheren Level).

Aufgabe mit Lösung#

gegeben:

  • ein String, z.B. `s = “Hallo Echo! Hallo Otto!”

  • eine Liste tokens_start_stop von Tupeln, die jeweils den Start und das Ende eines Teilstrings angeben.

s = "Hallo Echo! Hallo Otto!"
p = "01234567890123456789012"
s[0:5]
s[6:10]
'Echo'
tokens_start_stop = [(0,4), (6,9), (12,16), (18,21)]

gesucht: eine Schleife, die zur Liste tokens die zugehörigen Teilstrings in einer Liste sammelt.

Korrekte Lösung:

# Vorbereitung
t_strings = []
for x in tokens_start_stop:
    print(x)
(0, 4)
(6, 9)
(12, 16)
(18, 21)
# konventionell
t_strings = []
for start, stop in tokens_start_stop:
    t_strings.append( s[start:stop+1] )
t_strings
['Hallo', 'Echo', 'Hallo', 'Otto']
# oder als List Comprehension
t_strings = [ s[start:stop+1] for (start, stop) in tokens_start_stop ]
t_strings
['Hallo', 'Echo', 'Hallo', 'Otto']

Lösung kaputtisieren#

t_strings = {}
for start, stop in tokens_start_stop:
    t_strings.append( s[start:stop] )
t_strings
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
Cell In[6], line 3
      1 t_strings = {}
      2 for start, stop in tokens_start_stop:
----> 3     t_strings.append( s[start:stop] )
      4 t_strings

AttributeError: 'dict' object has no attribute 'append'

Typ von Klausuraufgabe: kaputte Lösung reparieren#

gegeben:

  • ein String,

    • z.B. s = "Hallo Echo! Hallo Otto!"

  • eine Liste tokens_start_stop von Tupeln, die jeweils den Start und das Ende eines Teilstrings angeben.

    • z.B. tokens_start_stop = [(0,4), (6,9), (12,16), (18,21)]

gweünschte Ausgabe:

eine “Lösung”, die unvollstänig ist, und auch noch einen Fehler enthält.

Aufgabe: korrigieren und ergänzen Sie die fehlerhafte Lösung!

tokens_start_stop = [(0,4), (6,9), (12,16), (18,21)]
s = "Hallo Echo! Hallo Otto!"

def tokens(string, start_stop_list):
    to_return = {}
    for start, stop in start_stop_list:
        ...
    return to_return
# tokens(s, tokens_start_stop) == ['Hallo', 'Echo', 'Hallo', 'Otto']
tokens(s, tokens_start_stop)
{}
# auch eine Lösung

s = "Hallo Echo! Hallo Otto!"
tokens_start_stop = [(0,4), (6,9), (12,16), (18,21)]

def tokens(string, start_stop_list):
    to_return = {}
    for start, stop in start_stop_list:
        to_return[(start,stop)] = string[start:stop+1]
    return [ x for x in to_return.values() ]
tokens(s, tokens_start_stop)
['Hallo', 'Echo', 'Hallo', 'Otto']

misc#

Da bin ich auch schon ‘drauf ‘reingefallen:

# gleicher Typ bei index und slice
s = "Hallo"
s[1], s[1:3]
('a', 'al')
# unterschiedlicher Typ bei index und slice!
s = list("Hallo")
s[1], s[1:3]
('a', ['a', 'l'])
s = "Hallo"
for x in range(len(s)):
    print(s[x:x+2])
Ha
al
ll
lo
o
s = list("Hallo")
for x in range(len(s)):
    print(s[x:x+3])
['H', 'a', 'l']
['a', 'l', 'l']
['l', 'l', 'o']
['l', 'o']
['o']