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?
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
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.
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.
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'}
>>>
Podobne pytania
Nowe pytania
python
Python to wielozadaniowy, wielozadaniowy język programowania dynamicznie typowany. Został zaprojektowany tak, aby był szybki do nauczenia się, zrozumienia i użycia oraz wymuszania czystej i jednolitej składni. Należy pamiętać, że Python 2 oficjalnie nie jest obsługiwany od 01-01-2020. Mimo to, w przypadku pytań Pythona specyficznych dla wersji, dodaj znacznik [python-2.7] lub [python-3.x]. Korzystając z wariantu Pythona (np. Jython, PyPy) lub biblioteki (np. Pandas i NumPy), należy umieścić go w tagach.