Kolejność wyświetlania wartości w słowniku

0

Witam. W funkcji która zwraca słownik wartości wyswietlane sa w innej kolejnosci jak podane imie, nazwisko, lokacja, dziedzina, wiek. Dlaczego jest w takiej kolejnosci? :)

def tworzenie_profilu(first, last, **user_info):
    """Slownik z informacjami o uzytkowniku"""
    user_info['imie'] = first
    user_info['nazwisko'] = last
    return user_info

profil_uzytkownika = tworzenie_profilu('albert', 'eistein', lokacja = 'princeton', dziedzina = 'fizyka', wiek = 50)

print(profil_uzytkownika)

Dane wyjsciowe:
{'lokacja': 'princeton', 'dziedzina': 'fizyka', 'wiek': 50, 'imie': 'albert', 'nazwisko': 'eistein'}

2

W Pythonie 3.7+ słownik zachowuje kolejność insercji. Nazwane parametry są rozwiązywane przez pozycyjnymi (żeby wiedzieć, jakie pozycyjne w ogóle zostały), stąd wypadają wcześniej.

Nie jestem pewien, czy coś gwarantuje kolejność w ramach rozwiązywania nazwanych, więc kolejność między lokacja, dziedzina a wiek może być przypadkowa (a może coś faktycznie gwarantuje, więc może nie jest).

EDYCJA:
Doczytałem, i od Pythona 3.6 kolejność **kwargs jest gwarantowana taka, jak w wywołaniu, zatem koniecznie musi być lokacja, dziedzina, wiek, imie, nazwisko.

1

Bo interpreter zaczyna od wartości z keywordem. 'albert', 'eistein' nie posiadają keyworda a user_info to w twoim przypadku zmapowanie wartości.

0

istnieje sposob na zachowanie kolejności wyświetlania wartości tak jak są podawane?

3
LuFCc napisał(a):

istnieje sposob na zachowanie kolejności wyświetlania wartości tak jak są podawane?

def tworzenie_profilu(first, last, **user_info):
    return {'imie': first, 'nazwisko': last, **user_info}

tworzenie_profilu('albert', 'eistein', lokacja = 'princeton', dziedzina = 'fizyka', wiek = 50)
2

Jw., ale zwróć uwagę, że jeśli ktoś wywoła tę funkcję jawnie podając parametry pozycyjne, tzn. tworzenie_profilu(last='einstein', first='albert', lokacja = 'princeton', dziedzina = 'fizyka', wiek = 50), to wciąż dostanie słownik, w którym jest najpierw imie, a potem nazwisko. Możesz to spróbować obejść chociażby wymuszając, żeby imienazwisko były argumentami pozycyjnymi: tzn.

def tworzenie_profilu(first, last, /, **user_info):
  …

1 użytkowników online, w tym zalogowanych: 0, gości: 1