TypeError: ‘dict’-object kan niet worden aangeroepen

Ik probeer elementen van een invoerreeks te herhalen en ze uit een woordenboek te halen. Wat doe ik verkeerd?

number_map = { 1: -3, 2: -2, 3: -1, 4: 1, 5: 2, 6: 3 }
input_str = raw_input("Enter something: ")
strikes = [number_map(int(x)) for x in input_str.split()]

strikes  = [number_map(int(x)) for x in input_str.split()]
TypeError: 'dict' object is not callable

Antwoord 1, autoriteit 100%

De syntaxis voor toegang tot een dictaat met een sleutel is number_map[int(x)]. number_map(int(x)) zou eigenlijk een functieaanroep zijn, maar aangezien number_map niet kan worden aangeroepen, wordt er een uitzondering gemaakt.


Antwoord 2, autoriteit 46%

Toegang tot het woordenboek met vierkante haken.

strikes = [number_map[int(x)] for x in input_str.split()]

Antwoord 3, autoriteit 36%

Je moet [] gebruiken om toegang te krijgen tot elementen van een woordenboek. Niet ()

  number_map = { 1: -3, 2: -2, 3: -1, 4: 1, 5: 2, 6: 3 }
input_str = raw_input("Enter something: ")
strikes = [number_map[int(x)] for x in input_str ]

Antwoord 4, autoriteit 15%

strikes = [number_map[int(x)] voor x in input_str.split()]

Je krijgt een element uit een dict met deze [] haakjes, niet deze ().


Antwoord 5, autoriteit 15%

strikes = [number_map[int(x)] for x in input_str.split()]

Gebruik vierkante haken om woordenboeken te verkennen.


Antwoord 6, autoriteit 8%

U moet gebruiken:

number_map[int(x)]

Let op de vierkante haken!


Antwoord 7, autoriteit 3%

Een meer functionele benadering zou zijn door gebruik te maken van dict.get

input_nums = [int(in_str) for in_str in input_str.split())
strikes = list(map(number_map.get, input_nums.split()))

Je kunt zien dat de conversie een beetje onhandig is, het zou beter zijn om de abstractie van functiecompositie te gebruiken :

def compose2(f, g):
    return lambda x: f(g(x))
strikes = list(map(compose2(number_map.get, int), input_str.split()))
Example:
list(map(compose2(number_map.get, int), ["1", "2", "7"]))
Out[29]: [-3, -2, None]

Natuurlijk zou je in Python 3 de expliciete conversie naar een list vermijden. Een meer algemene benadering voor het samenstellen van functies in Python is hier te vinden.

(Opmerking: ik kwam hier vanuit het Ontwerp van computerprogramma’s Udacity-klasse, om te schrijven:)

def word_score(word):
    "The sum of the individual letter point scores for this word."
    return sum(map(POINTS.get, word))

Antwoord 8, autoriteit 2%

het is number_map[int(x)], je hebt geprobeerd de kaart daadwerkelijk aan te roepen met één argument

LEAVE A REPLY

Please enter your comment!
Please enter your name here

5 × one =

Other episodes