2016-04-17 2 views
19

В PyCharm, когда я пишу:Почему можно заменить set() на {}?

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

он говорит "Вызов функции может быть заменен набором буквального" так он заменяет его:

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

Почему? A set() в Python - это не то же самое, что и словарь {}?

И если он хочет оптимизировать это, почему это более эффективно?

+2

Обратите внимание, что, несмотря на ваш титул, вы ** не может ** заменить 'набор()' с '{}', но вы можете * * заменить непустое 'набор ((1, 2, 3)) 'с буквальным' {1, 2, 3} ', потому что теперь ясно, что это не словарь. См. Https://docs.python.org/2/library/stdtypes.html#set-types-set-frozenset – jonrsharpe

ответ

31

наборы Python и словари могут быть оба построены с использованием фигурных скобок:

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

my_set = {1, 2, 3}

Переводчик (и человека читатели) могут различать между ними на основе их содержание. Однако невозможно различать пустой набор и пустой dict, поэтому в этом случае вам нужно использовать set() для пустых наборов для устранения неоднозначности.

Очень простой тест предполагает, что буквальная конструкция быстрее (python3.5):

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

This question охватывает некоторые вопросы выполнения буквенных конструкций над встроенными функциями, хотя и для списков и dicts. Как представляется, резюме состоит в том, что литературные конструкции требуют меньше работы от переводчика.

+0

Литературная конструкция, вероятно, быстрее, потому что вы не создаете промежуточный список; что, если вы это отрицаете? – jonrsharpe

+1

@jonrsharpe все еще кажется медленнее: 'timeit.timeit (stmt = 'a = set (mylist)', setup = 'mylist = [1, 2, 3]') -> 0.3987466390244663' - Я думаю, что ссылка, которую я добавил, охватывает некоторые этого. – snakecharmerb

+0

Ницца, спасибо за проверку. – jonrsharpe

4

Это альтернативный синтаксис для 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 синтаксис отличается. Он состоит из пар ключ-значение. Например:

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

set([iterable]) является конструктором для создания набора из необязательного итерационного iterable. И {} - это создание литералов объекта set/dict. Итак, что создано, зависит от того, как вы его используете.

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