Napisz funkcję, która dodaje jeden do każdej wartości liczbowej w słowniku. Jeśli wartość nie jest liczbą (tj. Nie jest liczbą typu int ani float), nie dodawaj niczego, ale zachowaj tę samą wartość. Funkcja powinna przyjmować słownik jako argument i zwracać zmodyfikowany słownik.

Zwróć szczególną uwagę na zapętlanie kluczy i wartości w słownikach za pomocą funkcji items (). Wzorzec do użycia z „items ()” to:

for key, value in mydict.items():


    
    def addtovalue(dictionary):
    "Add one to each numeric value of the dictionary, return the dict"
    
    # TYPE YOUR CODE HERE.
    
    dictionary = { 'fred': 3.3, 'marie': '5', 'jean': 14, 'angus': 44, 'amine': 'blue'}
    
    for k,v in dictionary.items():

        if v is not float or int:
            print(v)
        else:
            new_v = v + 1
            print(new_v)

To jest to, co mam do tej pory, ale nie działa. Jestem początkujący. Jak jednocześnie zmodyfikować wszystkie wartości w słowniku?

0
Charlotte Grosjean 19 grudzień 2019, 14:45

4 odpowiedzi

Myślę, że do tej pory brakuje Ci isinstance do sprawdzania typów, tj.

if not (isinstance(v, int) or isinstance(v, float)):

Jeśli chodzi o faktyczne przypisanie wartości, możesz zrobić coś takiego:

dictionary[k] = new_v

Lub

dictionary.update({k: new_v})

Być może już zdajesz sobie z tego sprawę, ale aby kod został uwzględniony w funkcji, musisz wciąć kod, który chcesz w funkcji. W końcu może to wyglądać mniej więcej tak:

def addtovalue(dictionary):
    "Add one to each numeric value of the dictionary, return the dict"

    for k,v in dictionary.items():

        if not (isinstance(v, int) or isinstance(v, float)):
            print(v)
        else:
            new_v = v + 1
            print(new_v)
            dictionary[k] = new_v

    return dictionary

Do którego możesz zadzwonić za pomocą czegoś takiego:

dictionary = { 'fred': 3.3, 'marie': '5', 'jean': 14, 'angus': 44, 'amine': 'blue'}
addtovalue(dictionary)
# {'fred': 4.3, 'marie': '5', 'jean': 15, 'angus': 45, 'amine': 'blue'}

I które, jak zauważył @Jonas Palačionis, możesz uprościć to do czegoś takiego:

def addtovalue(dictionary):
    "Add one to each numeric value of the dictionary, return the dict"

    for k,v in dictionary.items():
        if (isinstance(v, int) or isinstance(v, float)):
            dictionary.update({k: v+1})

    return dictionary

Możesz uprościć jeszcze bardziej, używając rozumienia ze słownika i numbers.Number, jak wskazał @rasjani, w ten sposób:

import numbers

def addtovalue(dictionary):
    "Add one to each numeric value of the dictionary, return the dict"
    dictionary.update({k: v+1 
                       for (k,v) in d.items() 
                       if isinstance(v, numbers.Number)})
    return dictionary
0
Patrick 19 grudzień 2019, 17:53

Nie „modyfikujesz wszystkich wartości w słowniku naraz”, modyfikujesz je klucz po kluczu. Prostym sposobem zmodyfikowania wartości dla danego klucza jest po prostu przypisanie wartości do klucza:

d = {"a":1, "b": 2}
d["a"] = 42
print(d)

Więc zamiast drukować zaktualizowane wartości, chcesz zaktualizować sam dykt.

Kilka innych rzeczy:

if v is not float or int:

Jest podwójnie błędny. Po pierwsze, aby sprawdzić typ zmiennej, nie wykonujesz testu tożsamości względem typu, użyj isinstance(var, cls) (zalecane) lub type(var) is cls (jeśli naprawdę chcesz ograniczyć test do dokładnej klasy) . Następnie wyrażenie „x == y lub z” nie porównuje „x” z „y”, a następnie z „z”. Jest oceniany jako „(x == y) lub (z)”, co jest zupełnie inne:

>>> x = 42
>>> x == 33 or 22
22
>>> x == 42 or 22
True
>>> x == 22 or 42
42
>>> 

IOW musisz pisać wyraźne porównania:

>>> x == 22 or x == 42
True
>>> x == 42 or x == 22
True
>>> x == 33 or x == 22
False
>>> 

I na koniec, przeczytaj ponownie swoje specyfikacje, wyraźnie mówią ci, że 1 / powinieneś pracować nad dyktatem, który jest przekazywany do twojej funkcji, a 2 / że powinieneś zwrócić zmodyfikowany dykt z funkcji.

0
marc_s 20 grudzień 2019, 23:58

Użyj tego:

dictionary = {'fred': 3.3, 'marie': '5',
              'jean': 14, 'angus': 44, 'amine': 'blue'}


def new_dict(my_dict):
    for k, v in my_dict.items():
        if (isinstance(v, int) or isinstance(v, float)):
            my_dict.update({k: v+1})

    return my_dict


print(new_dict(dictionary))

{'fred': 4.3, 'marie': '5', 'jean': 15, 'angus': 45, 'amine': 'blue'}

Iterujesz w słowniku i sprawdzasz, czy wartość każdej pary to int lub float, a jeśli tak, aktualizujesz wartość tego klucza, dodając 1 za pomocą .update({k,v+1})

A twoje zadanie prosi cię o napisanie funkcji, a nie piszesz funkcji.

0
Jonas Palačionis 19 grudzień 2019, 15:36

Prawdopodobnie istnieją bardziej wydajne i łatwiejsze do odczytania rozwiązania, ale można użyć funkcji zrozumienia dyktowania do wygenerowania oddzielnego dyktu, który ma zaktualizowane wszystkie wartości liczbowe, a następnie ten nowy dykt można zaktualizować do istniejącego:

import numbers
d = { 'fred': 3.3, 'marie': '5', 'jean': 14, 'angus': 44, 'amine': 'blue'}
d.update({ k: v+1 for (k,v) in d.items() if isinstance(v, numbers.Number) })

A wynik wygląda następująco:

>>> print(d)
{'fred': 4.3, 'marie': '5', 'jean': 15, 'angus': 45, 'amine': 'blue'}
>>>
0
rasjani 19 grudzień 2019, 15:49