Utilisation avancée des conteneurs

Un conteneur de plus : set

Un set est non ordonné et ne contient qu’une seule occurrence de chacun de ses éléments (non duplication).

[1]:
# construction littéral
{1, 2, 'toto', 2, 3.14}
[1]:
{1, 2, 3.14, 'toto'}

Les opérations d’ensembles sont disponibles

[2]:
# union
{2, 3, 4} | {1, 2}
[2]:
{1, 2, 3, 4}
[3]:
# intersection
{2, 3, 4} & {1, 2}
[3]:
{2}
[4]:
# différence
{2, 3, 4} - {1, 2}
[4]:
{3, 4}
[5]:
# différence symétrique
{2, 3, 4} ^ {1, 2}
[5]:
{1, 3, 4}
[6]:
# une manière d'enlever les doublons d'une liste
l = [1, 2, 3, 2, 4, 1, 4]
set(l)
[6]:
{1, 2, 3, 4}

Les méthodes des conteneurs de base

[7]:
def compare_methodes(type1, type2):
    build_attr = lambda type_: set(e for e in dir(type_) if e[0] != '_')
    attr1 = build_attr(type1)
    attr2 = build_attr(type2)

    print(f'* méthodes communes à {type1.__name__} et {type2.__name__}:')
    print(list(attr1 & attr2))
    print()
    print(f'* méthodes propres à {type1.__name__} :')
    print(list(attr1 - attr2))
    print()
    print(f'* méthodes propres à {type2.__name__} :')
    print(list(attr2 - attr1))

list vs tuple

[8]:
compare_methodes(list, tuple)
* méthodes communes à list et tuple:
['count', 'index']

* méthodes propres à list :
['pop', 'append', 'extend', 'sort', 'remove', 'copy', 'reverse', 'insert', 'clear']

* méthodes propres à tuple :
[]
[9]:
help(list.append)
Help on method_descriptor:

append(self, object, /)
    Append object to the end of the list.

[10]:
help(list.extend)
Help on method_descriptor:

extend(self, iterable, /)
    Extend list by appending elements from the iterable.

list vs dict

[11]:
compare_methodes(list, dict)
* méthodes communes à list et dict:
['pop', 'clear', 'copy']

* méthodes propres à list :
['append', 'index', 'extend', 'sort', 'remove', 'count', 'reverse', 'insert']

* méthodes propres à dict :
['values', 'get', 'items', 'keys', 'fromkeys', 'setdefault', 'popitem', 'update']
[12]:
help(dict.get)
Help on method_descriptor:

get(self, key, default=None, /)
    Return the value for key if key is in the dictionary, else default.

[13]:
help(dict.setdefault)
Help on method_descriptor:

setdefault(self, key, default=None, /)
    Insert key with a value of default if key is not in the dictionary.

    Return the value for key if key is in the dictionary, else default.

[14]:
help(dict.update)
Help on method_descriptor:

update(...)
    D.update([E, ]**F) -> None.  Update D from dict/iterable E and F.
    If E is present and has a .keys() method, then does:  for k in E: D[k] = E[k]
    If E is present and lacks a .keys() method, then does:  for k, v in E: D[k] = v
    In either case, this is followed by: for k in F:  D[k] = F[k]

list vs set

[15]:
compare_methodes(list, set)
* méthodes communes à list et set:
['clear', 'pop', 'remove', 'copy']

* méthodes propres à list :
['append', 'index', 'extend', 'sort', 'count', 'reverse', 'insert']

* méthodes propres à set :
['difference', 'add', 'union', 'symmetric_difference', 'isdisjoint', 'discard', 'intersection', 'intersection_update', 'issubset', 'issuperset', 'symmetric_difference_update', 'difference_update', 'update']
[16]:
help(set.add)
Help on method_descriptor:

add(...)
    Add an element to a set.

    This has no effect if the element is already present.

dict vs set

[17]:
compare_methodes(dict, set)
* méthodes communes à dict et set:
['pop', 'update', 'clear', 'copy']

* méthodes propres à dict :
['values', 'get', 'items', 'keys', 'fromkeys', 'setdefault', 'popitem']

* méthodes propres à set :
['difference', 'add', 'union', 'symmetric_difference', 'isdisjoint', 'discard', 'intersection', 'intersection_update', 'issubset', 'issuperset', 'remove', 'symmetric_difference_update', 'difference_update']

Exercices