Використовуйте фігурні дужки для ініціалізації набору в Python


98

Я вивчаю python, і у мене виникає запитання щодо початківців про ініціалізацію наборів. Шляхом тестування я виявив, що набір можна ініціалізувати так:

my_set = {'foo', 'bar', 'baz'}

Чи є якісь недоліки в тому, щоб робити це таким чином, на відміну від стандартного способу:

my_set = set(['foo', 'bar', 'baz'])

чи це лише питання стилю?


2
Документація це згадує, просто немає. Зверніть увагу, що це документація до застарілого модуля, тепер реальні набори вбудовані. Це в документі "Що нового в Python 2.7", а посилання на мову коротко описує це: docs.python.org/2/reference/expressions.html#set-displays

@delnan Я використовую python 2.7, тому я не думав заглядати в python 3 документи. Посилання, яке я розмістив, стосується 2.7, але воно, як не дивно, не згадує про це.
fvrghl

1
Оскільки я відредагував свій коментар, 2.7 документа також про це згадують. Ви розмістили посилання застаріле, пережиток минулого, неправильне, застаріле. Забудьте про те, що він існує, і використовуйте замість нього те, що він вам сам пропонує: docs.python.org/2/library/stdtypes.html#set та docs.python.org/2/library/stdtypes.html#frozenset

@delnan Дякую за допомогу. Я відредагував запитання так, що більше не кажу, що для нього немає документації (хоча в Інтернеті є кілька прикладів, де це згадується).
fvrghl

Для перехожого: Pycharm застерігає від використання виклику функції, коли можна використовувати літерал - можуть бути причини продуктивності - тому віддайте перевагу встановленому буквальному шляху в новому коді
Mr_and_Mrs_D

Відповіді:


102

Існує дві очевидні проблеми із встановленим синтаксисом літералу:

my_set = {'foo', 'bar', 'baz'}
  1. Він недоступний до версії Python 2.7

  2. Немає можливості виразити порожній набір за допомогою цього синтаксису (використання {}створює порожній dict)

Вони можуть бути для вас важливими, а можуть і не бути.

Розділ документів, що описує цей синтаксис, знаходиться тут .


46

Порівняйте також різницю між {}і set()з одним аргументом слова.

>>> a = set('aardvark')
>>> a
{'d', 'v', 'a', 'r', 'k'} 
>>> b = {'aardvark'}
>>> b
{'aardvark'}

але обидва aі bє наборами, звичайно.


4
тому я люблю нагадувати собі конструктор наборів, set([])а не просто set().
Michael Ekoka

3
set()завжди приймайте один аргумент. Один ітеративний.
Джордж Кеттлборо,

1
@GeorgeKettleborough одиночний або відсутні аргументи, останній для створення порожнього набору.
gertvdijk,

28

З документації Python 3 ( те саме стосується python 2.7 ):

Для створення наборів можна використовувати фігурні дужки або функцію set (). Примітка: для створення порожнього набору потрібно використовувати set (), а не {}; останній створює порожній словник, структуру даних, яку ми обговоримо в наступному розділі.

в python 2.7:

>>> my_set = {'foo', 'bar', 'baz', 'baz', 'foo'}
>>> my_set
set(['bar', 'foo', 'baz'])

Майте на увазі, що {}це також використовується для map/ dict:

>>> m = {'a':2,3:'d'}
>>> m[3]
'd'
>>> m={}
>>> type(m)
<type 'dict'> 

Можна також використовувати всебічний синтаксис для ініціалізації наборів:

>>> a = {x for x in """didn't know about {} and sets """ if x not in 'set' }
>>> a
set(['a', ' ', 'b', 'd', "'", 'i', 'k', 'o', 'n', 'u', 'w', '{', '}'])

1

Вам потрібно зробити, empty_set = set()щоб ініціалізувати порожній набір. {}це пустий словник.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.