web-dev-qa-db-fra.com

Pourquoi est-il possible de remplacer parfois set () par {}?

Dans PyCharm, quand j'écris:

return set([(sy + ady, sx + adx)])

il dit "L'appel de fonction peut être remplacé par set literal" donc il le remplace par:

return {(sy + ady, sx + adx)}

Pourquoi donc? Une set() dans Python n'est pas la même chose qu'un dictionnaire {}?

Et s'il veut optimiser cela, pourquoi est-ce plus efficace?

47
Olivier Pons

Les ensembles et les dictionnaires Python peuvent tous deux être construits à l'aide d'accolades:

my_dict = {'a': 1, 'b': 2}

my_set = {1, 2, 3}

L'interprète (et les lecteurs humains) peuvent les distinguer en fonction de leur contenu. Cependant, il n'est pas possible de faire la distinction entre un ensemble vide et un dict vide, donc dans ce cas, vous devez utiliser set() pour que les ensembles vides désambiguïsent.

Un test très simple suggère que la construction littérale est plus rapide (python3.5):

>>> timeit.timeit('a = set([1, 2, 3])')
0.5449375328607857
>>> timeit.timeit('a = {1, 2, 3}')
0.20525191631168127

Cette question couvre certains problèmes de performance des constructions littérales sur les fonctions intégrées, bien que pour les listes et les dict. Le résumé semble être que les constructions littérales nécessitent moins de travail de la part de l'interprète.

72
snakecharmerb

Il s'agit d'une syntaxe alternative pour set()

>>> a = {1, 2}
>>> b = set()
>>> b.add(1)
>>> b.add(2)
>>> b
set([1, 2])
>>> a
set([1, 2])
>>> a == b
True
>>> type(a) == type(b)
True

dict la syntaxe est différente. Il se compose de paires clé-valeur. Par exemple:

my_obj = {1:None, 2:None}
7
DhruvPathak

Un autre exemple de la façon dont set et {} sont non interchangeables (comme jonrsharpe l'a mentionné):

In: f = 'FH'

In: set(f)
Out: {'F', 'H'}

In: {f}
Out: {'FH'}
3
Emanuel

set([iterable]) est le constructeur pour créer un ensemble à partir de l'itération facultative iterable. Et {} consiste à créer des littéraux d'objet set/dict. Donc, ce qui est créé dépend de la façon dont vous l'utilisez.

In [414]: x = {}

In [415]: type(x)
Out[415]: dict

In [416]: x = {1}

In [417]: type(x)
Out[417]: set

In [418]: x = {1: "hello"}

In [419]: type(x)
Out[419]: dict
2
C Panda