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

Kolejność wyświetlania wartości w słowniku
LF
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 34
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? :)

Kopiuj
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'}

Althorion
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1620
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.

ledi12
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
1

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

LF
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 34
0

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

Riddle
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10231
3
LuFCc napisał(a):

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

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

tworzenie_profilu('albert', 'eistein', lokacja = 'princeton', dziedzina = 'fizyka', wiek = 50)
Althorion
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1620
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.

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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.