Kurzusok
/
Python
Python
/
Tanterv
/
Szótármetódusok
Sz

Szótármetódusok ebben a kurzusban: Python

2 feladat

A(z) Szótármetódusok fogalomról

A Python dict osztálya sok hasznos metódust kínál a szótárakkal való munkához. Ezek egy részét a dict-ekről szóló fogalom már bemutatta. Most néhány továbbival foglalkozunk, valamint néhány technikával, amelyekkel bejárhatod és módosíthatod a szótárakat.

  • A <dict>.setdefault() automatikusan hozzáad kulcsokat anélkül, hogy KeyError-t dobna.
  • A <dict>.fromkeys(<iterable>, <default value>) tetszőleges számú iterálható elemből új dict-et hoz létre.
  • A <dict>.keys(), a <dict>.values() és a <dict>.items() kényelmes iterátorokat ad.
  • A sorted(<dict>.items()) könnyedén átrendezi egy dict bejegyzéseit.
  • A <dict_one>.update(<dict_two>) frissít egy dict-et egy másik dict átfedő értékeivel.
  • A <dict> | <other_dict> és a <dict> |= <other_dict> operátorokkal összefésül vagy frissít két dict-et.
  • A reversed(<dict>.keys()), a reversed(<dict>.values()) vagy a reversed(<dict>.items()) megfordított nézeteket ad.
  • A <dict>.popitem() eltávolít és visszaad egy key, value párt.

setdefault() a hibamentes beszúráshoz

A szótár fogalma korábban már bemutatta, hogy a <dict>.get(<key>, <default value>) visszaadja a meglévő value-t, vagy a default value-t, ha a key nem található a szótárban, így elkerülve a KeyError-t. Ez jól működik olyan helyzetekben, amikor nem szeretnél külön hibakezelést, de nem bízhatsz benne, hogy a keresett key jelen lesz.

Hasonlóan »biztonságos« (KeyError nélküli) beszúráshoz a <dict>.setdefault(<key>, <default value>) metódus használható. A <dict>.setdefault(<key>, <default value>) visszaadja a value-t, ha a key megtalálható a szótárban. Ha a kulcs nincs meg, akkor beszúrja a (key, default value) párt, és használatra visszaadja a default value-t.

>>> palette_I = {'Grassy Green': '#9bc400', 'Purple Mountains Majesty': '#8076a3', 'Misty Mountain Pink': '#f9c5bd'}

# Looking for the value associated with key "Rock Brown".The key does not exist, 
# so it is added with the default value, and the value is returned.
>>> palette.setdefault('Rock Brown', '#694605')
'#694605'

# The (key, default value) pair has now been added to the dictionary.
>>> palette_I
{'Grassy Green': '#9bc400', 'Purple Mountains Majesty': '#8076a3', 'Misty Mountain Pink': '#f9c5bd', 'Rock Brown': '#694605'}

fromkeys(): szótár feltöltése iterálható elemből

Ha gyorsan fel szeretnél tölteni egy szótárat különböző keys és alapértelmezett értékekkel, az fromkeys(<iterable>, <default value>) osztálymetódus végigmegy a keys iterálható elemén, és létrehoz egy új dict-et. Minden values a megadott default value-ra áll be:

>>> new_dict = dict.fromkeys(['Grassy Green', 'Purple Mountains Majesty', 'Misty Mountain Pink'], 'fill in hex color here')

{'Grassy Green': 'fill in hex color here',
 'Purple Mountains Majesty': 'fill in hex color here',
 'Misty Mountain Pink': 'fill in hex color here'}

(key, value) pár eltávolítása és visszaadása a .popitem() metódussal

A .popitem() eltávolít és visszaad egyetlen (key, value) párt a szótárból. A párok utolsóként be, elsőként ki (LIFO) sorrendben jönnek vissza. Ha a szótár üres, a popitem() hívása KeyError-t dob:

>>> palette_I = {'Grassy Green': '#9bc400', 
                 'Purple Mountains Majesty': '#8076a3', 
                 'Misty Mountain Pink': '#f9c5bd'}
>>> palette_I.popitem()
('Misty Mountain Pink', '#f9c5bd')

>>> palette_I.popitem()
('Purple Mountains Majesty', '#8076a3')

>>> palette_I.popitem()
('Grassy Green', '#9bc400')

# All (key, value) pairs have been removed.
>>> palette_I.popitem()
Traceback (most recent call last):
  line 1, in <module>
    palette_I.popitem()
KeyError: 'popitem(): dictionary is empty'

Bejegyzések bejárása egy szótárban nézeteken keresztül

A .keys(), a .values() és a .items() metódusok egy szótár iterálható nézeteit adják vissza.

Ezekkel a nézetekkel könnyedén végigmehetsz a bejegyzéseken anélkül, hogy módosítanád őket. A nézetek dinamikusak is: amikor a szótár mögöttes adatai megváltoznak, a hozzájuk tartozó view object tükrözi a változást:

>>> palette_I = {'Grassy Green': '#9bc400', 
                 'Purple Mountains Majesty': '#8076a3', 
                 'Misty Mountain Pink': '#f9c5bd'}

# Using .keys() returns a list of keys.
>>> palette_I.keys()
dict_keys(['Grassy Green', 'Purple Mountains Majesty', 'Misty Mountain Pink'])

# Using .values() returns a list of values.
>>> palette_I.values()
dict_values(['#9bc400', '#8076a3', '#f9c5bd'])

# Using .items() returns a list of (key, value) tuples.
>>> palette_I.items()
dict_items([('Grassy Green', '#9bc400'), ('Purple Mountains Majesty', '#8076a3'), ('Misty Mountain Pink', '#f9c5bd')])

# Views are dynamic.  Changing values in the dict 
# changes all of the associated views.
>>> palette_I['Purple Mountains Majesty'] = (128, 118, 163)
>>> palette_I['Deep Red'] = '#932432'

>>> palette_I.values()
dict_values(['#9bc400', (128, 118, 163), '#f9c5bd', '#932432'])

>>> palette_I.keys()
dict_keys(['Grassy Green', 'Purple Mountains Majesty', 'Misty Mountain Pink', 'Deep Red'])

>>> palette_I.items()
dict_items([('Grassy Green', '#9bc400'), ('Purple Mountains Majesty', (128, 118, 163)), ('Misty Mountain Pink', '#f9c5bd'), ('Deep Red', '#932432')])

Még több a .keys(), .values() és .items() metódusról

A Python 3.7-től kezdve a dicts megőrzik a bejegyzések beszúrási sorrendjét, így a .keys(), a .values() vagy a .items() használatakor elsőként be, elsőként ki (FIFO) bejárás lehetséges.

A Python 3.8-tól kezdve a nézetek megfordíthatók is. Így a kulcsok, az értékek vagy a (key, value) párok utolsóként be, elsőként ki (LIFO) sorrendben is bejárhatók a reversed(<dict>.keys()), a reversed(<dict>.values()) vagy a reversed(<dict>.items()) segítségével:

>>> palette_II = {'Factory Stone Purple': '#7c677f', 
                  'Green Treeline': '#478559', 
                  'Purple baseline': '#161748'}
>>> for item in palette_II.items():
...     print(item)
...
('Factory Stone Purple', '#7c677f')
('Green Treeline', '#478559')
('Purple baseline', '#161748')

>>> for item in reversed(palette_II.items()):
...     print(item)
...
('Purple baseline', '#161748')
('Green Treeline', '#478559')
('Factory Stone Purple', '#7c677f')

Szótárak összevonása a .update() metódussal

A <dict_one>.update(<dict_two>) két szótár összevonására használható. Ez a metódus átveszi a <dict_two> (key,value) párjait, és beírja őket a <dict_one> szótárba:

>>> palette_I = {'Grassy Green': '#9bc400',
                 'Purple Mountains Majesty': '#8076a3',
                  'Misty Mountain Pink': '#f9c5bd'}
>>> palette_II = {'Factory Stone Purple': '#7c677f',
                  'Green Treeline': '#478559',
                  'Purple Baseline': '#161748'}

>>> palette_I.update(palette_II)

# Note that new items from palette_II are added.
>>> palette_I
{'Grassy Green': '#9bc400', 'Purple Mountains Majesty': '#8076a3', 'Misty Mountain Pink': '#f9c5bd', 'Factory Stone Purple': '#7c677f', 'Green Treeline': '#478559', 'Purple Baseline': '#161748'}

Ahol a két szótár kulcsai átfedésben vannak, ott a dict_one value-jét felülírja a dict_two megfelelő value-je:

>>> palette_I = {'Grassy Green': '#9bc400', 
                 'Purple Mountains Majesty': '#8076a3', 
                 'Misty Mountain Pink': '#f9c5bd', 
                 'Factory Stone Purple': '#7c677f', 
                 'Green Treeline': '#478559', 
                 'Purple baseline': '#161748'}
                   
>>> palette_III = {'Grassy Green': (155, 196, 0), 
                   'Purple Mountains Majesty': (128, 118, 163),
                   'Misty Mountain Pink': (249, 197, 189)}
>>> palette_I.update(palette_III)

# Overlapping values in palette_I are replaced with 
# values from palette_III
>>> palette_I
{'Grassy Green': (155, 196, 0),
  'Purple Mountains Majesty': (128, 118, 163), 
  'Misty Mountain Pink': (249, 197, 189), 
  'Factory Stone Purple': '#7c677f', 
  'Green Treeline': '#478559', 'Purple baseline': '#161748'}

Szótárak összefésülése vagy frissítése unió (| és |=) operátorokkal

A Python 3.9 egy másik módot vezet be a dicts összefésülésére: az union operátorokat. A dict_one | dict_two egy új szótárat hoz létre a dict_one és a dict_two (key, value) párjaiból. Amikor a két szótár közös kulcsokkal rendelkezik, a dict_two értékei élveznek elsőbbséget.

>>> palette_I = {'Grassy Green': '#9bc400', 
                 'Purple Mountains Majesty': '#8076a3', 
                 'Misty Mountain Pink': '#f9c5bd'}

>>> palette_II = {'Factory Stone Purple': '#7c677f', 
                  'Green Treeline': '#478559', 
                  'Purple baseline': '#161748'}

>>> new_dict = palette_I | palette_II
>>> new_dict
...
{'Grassy Green': '#9bc400',
 'Purple Mountains Majesty': '#8076a3',
 'Misty Mountain Pink': '#f9c5bd',
 'Factory Stone Purple': '#7c677f',
 'Green Treeline': '#478559',
 'Purple baseline': '#161748'}

A dict_one |= other hasonlóan viselkedik, mint a <dict_one>.update(<other>), ebben az esetben azonban az other lehet dict vagy (key, value) párok iterálható eleme:

>>> palette_III = {'Grassy Green': (155, 196, 0),
                   'Purple Mountains Majesty': (128, 118, 163),
                   'Misty Mountain Pink': (249, 197, 189)}
>>> new_dict |= palette_III
>>> new_dict
...
{'Grassy Green': (155, 196, 0),
'Purple Mountains Majesty': (128, 118, 163),
'Misty Mountain Pink': (249, 197, 189),
'Factory Stone Purple': '#7c677f',
'Green Treeline': '#478559',
'Purple baseline': '#161748'}

Szótár rendezése

A szótáraknak nincs beépített rendező metódusuk. Egy dict nézetét viszont rendezheted a beépített sorted() függvénnyel, a .items() használatával. A rendezett nézetből aztán új szótárat hozhatsz létre. Ha nem adsz meg rendezési kulcsot, az alapértelmezett rendezés a szótár keys értékei szerint történik.

# Default ordering for a dictionary is last in, first out (LIFO).
>>> color_palette = {'Grassy Green': '#9bc400', 
                    'Purple Mountains Majesty': '#8076a3', 
                    'Misty Mountain Pink': '#f9c5bd', 
                    'Factory Stone Purple': '#7c677f', 
                    'Green Treeline': '#478559', 
                    'Purple baseline': '#161748'}
 
 
# The default sort order for a dictionary uses the keys.
>>> sorted_palette = dict(sorted(color_palette.items()))
>>> sorted_palette
{'Factory Stone Purple': '#7c677f',
 'Grassy Green': '#9bc400',
 'Green Treeline': '#478559',
 'Misty Mountain Pink': '#f9c5bd',
 'Purple Mountains Majesty': '#8076a3',
 'Purple baseline': '#161748'}


# A sort key can be provided in the form
# of an anonymous function (lambda). 
>>> value_sorted_palette = dict(sorted(color_palette.items(), key=lambda color: color[1]))
>>> value_sorted_palette
{'Purple baseline': '#161748',
 'Green Treeline': '#478559',
 'Factory Stone Purple': '#7c677f',
 'Purple Mountains Majesty': '#8076a3',
 'Grassy Green': '#9bc400',
 'Misty Mountain Pink': '#f9c5bd'} 

Szótár kulcsainak és értékeinek felcserélése

A kulcsok és értékek megbízható felcserélése egy szótárban kis munkát igényel, de megoldható egy loop segítségével a dict.items() használatával, vagy egy szótárkifejezéssel. A biztonságos felcserélés feltételezi, hogy a dict kulcsai és értékei egyaránt hash-elhetők.

color_reference = {'Purple Mountains Majesty': '#8076a3',
                   'Misty Mountain Pink': '#f9c5bd',
                   'Factory Stone Purple': '#7c677f',
                   'Green Treeline': '#478559',
                   'Purple baseline': '#161748'}

# Creating a new dictionary to hold the swapped entries.
>>> swapped_color_reference = {}

# Iterating through the dictionary, using values as keys.
>>> for key, value in color_reference.items():
...     swapped_color_reference[value] = key

>>> swapped_color_reference
{'#8076a3': 'Purple Mountains Majesty',
 '#f9c5bd': 'Misty Mountain Pink',
 '#7c677f': 'Factory Stone Purple',
 '#478559': 'Green Treeline',
 '#161748': 'Purple baseline'}

 
# A dictionary comprehension can also be used to swap entries.
>>> swapped = {value: key for key, value in
               color_reference.items()}
>>> swapped
{'#8076a3': 'Purple Mountains Majesty',
 '#f9c5bd': 'Misty Mountain Pink',
 '#7c677f': 'Factory Stone Purple',
 '#478559': 'Green Treeline',
 '#161748': 'Purple baseline'}

Ha a dict-ben tárolt értékek nem egyediek, további ellenőrzésekre van szükség, mielőtt sor kerülhet a kulcsok és értékek felcserélésére:

# Things become more complicated if there are duplicates in 
# potential key values.This dict is arranged by hex, RGB, and HSL
# keys, but values repeat.
>>> extended_colors = {'#8076a3': 'Purple Mountains Majesty',
                       (128, 118, 163): 'Purple Mountains Majesty',
                       (21, 28, 0, 36): 'Purple Mountains Majesty',
                       '#f9c5bd': 'Misty Mountain Pink',
                       (249, 197, 189): 'Misty Mountain Pink',
                       (0, 21, 24, 2): 'Misty Mountain Pink',
                       '#7c677f': 'Factory Stone Purple',
                       (124, 103, 127): 'Factory Stone Purple',
                       (2, 19, 0, 50): 'Factory Stone Purple',
                       '#478559': 'Green Treeline',
                       (71, 133, 89): 'Green Treeline',
                       (47, 0, 33, 48): 'Green Treeline'}
                                
# New empty dictionary for holding swapped entries.
>>> consolidated_colors = {}

# Iterating over (key, value) pairs using .items()
>>> for key, value in extended_color_reference.items():
...    if value in consolidated_colors: # <--Check if key has already been created.
...        consolidated_colors[value].append(key)
...    else:
...        consolidated_colors[value] = [key]  # <--Create a value list with the former key in it.

>>> consolidated_colors
{'Purple Mountains Majesty': ['#8076a3', (128, 118, 163), (21, 28, 0, 36)],
 'Misty Mountain Pink': ['#f9c5bd', (249, 197, 189), (0, 21, 24, 2)],
 'Factory Stone Purple': ['#7c677f', (124, 103, 127), (2, 19, 0, 50)],
 'Green Treeline': ['#478559', (71, 133, 89), (47, 0, 33, 48)]}  

A szótárak és a velük való munkát segítő metódusok részletes magyarázatához a hivatalos útmutató és a hivatalos könyvtári leírás kiváló kiindulópont.

A Real Python és a Finxter szintén nagyon részletes cikkekkel rendelkezik a Python szótárakról.

A rendezésről bővebben lásd a Python dokumentációjában a Sorting HOW TO oldalt.

Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg

Tanuld meg a(z) Szótármetódusok fogalmat

A gyakorlás zárolva

Oldj fel még 3 feladatot, hogy gyakorolhasd a(z) Szótármetódusok fogalmat