빈 세트 리터럴?


460

[] = 비어 있음 list

() = 비어 있음 tuple

{} = 비어 있음 dict

공란과 비슷한 표기법이 set있습니까? 아니면 써야 set()합니까?


12
{i에서 i를 i로받지 않습니다. 그렇지 않습니까?
utdemir

3
파이썬으로 가능한 모든 것을 보여주고 싶습니다. set ()을 사용하지 않고 세트를 만들려면 할 수 있습니다.
utdemir

6
네, 당신은 백 번의 혼란스러운 방식으로 거의 모든 것을 할 수 있습니다. map(lambda x: x)코드 예제에 추가하지 않고 그것이 작동한다는 것을 보여줍니다. 그것은 문자 그대로의 세트가 아니며 단지 이해력입니다.

130
작동하는 바보 같은 방법입니다 {0}-{0}. 만큼 명확 set()하지는 않지만 재미있는 한 쌍의 눈처럼 보이는 장점이 있습니다.
wim

10
@Chris {}는 사전입니다. {0}세트입니다. {0} - {0}빈 집합 인 집합과 자체의 차이점입니다.
michaelsnowden

답변:


520

아니요, 빈 세트에 대한 리터럴 구문은 없습니다. 당신은 작성해야합니다 set().


빈 세트에 대한 리터럴 구문이 없다는 것을 의미합니까? 아니면 일반적으로 세트?
Johan Råde

15
설정된 리터럴이 있지만 Python 3.x에만 있습니다. 빈 세트에는 리터럴이 없습니다.

2
@ user763305 :이 시점에서 언어 매뉴얼이 명확합니다. docs.python.org/library/stdtypes.html#set-types-set-frozenset에 따르면 " 빈이 아닌 세트는 ... 중괄호 안에 쉼표로 구분 된 요소 목록을 배치하여 만들 수 있습니다"
S.Lott

43
실제로, set 리터럴은 Python 2.7로 백 포트되었으므로 Python 3에서만 엄격하게 사용할 수있는 것은 아닙니다.
Jim Brissom

13
@andy 이것은 빈 세트가 아닙니다. 숫자 1을 포함하는 세트입니다. 그런데 뒤에 쉼표가 필요하지 않습니다-튜플에만 필요합니다.
sepp2k

53

이용하시기 바랍니다 set() 빈 세트를 만들 수 있습니다.

그러나 사람들에게 감동을 주려면 리터럴을 사용하고 *Python> = 3.5 ( PEP 448 참조 )를 사용하여 빈 세트를 만들 수 있다고 알려주십시오 .

>>> s = {*()}  # or {*{}} or {*[]}
>>> print(s)
set()

이것은 기본적으로 더 압축 된 방법 {_ for _ in ()}이지만, 그렇게하지 마십시오.


왜?! 성능은 거의 동일합니다.$ python3.7 -m timeit 'set()' 2000000 loops, best of 5: 177 nsec per loop $ python3.7 -m timeit '{*()}' 2000000 loops, best of 5: 171 nsec per loop
ogurets

9
@ ogurets set()는 이해하기가 훨씬 쉬우 며 (코드 관리자의 경우) 성능보다 중요한 경우가 많습니다. {*()}거의 영리한 의미에서 "영리한"것 같습니다.
benjimin

허, 영리하다.
Kowalski

46

허용되는 답변을 확장하려면 다음을 수행하십시오.

버전 2.73.1파이썬 에서 사용법의 형태로 set리터럴 {}을 얻었 {1,2,3}지만 {}여전히 빈 dict에 사용되었습니다.

Python 2.7 (파이썬 <2.7에서 첫 번째 줄은 유효하지 않습니다)

>>> {1,2,3}.__class__
<type 'set'>
>>> {}.__class__
<type 'dict'>

파이썬 3.x

>>> {1,4,5}.__class__
<class 'set'>
>>> {}.__class__
<type 'dict'>

자세한 내용은 https://docs.python.org/3/whatsnew/2.7.html#other-language-changes


12
이 답변은 잘못되었습니다. 빈 세트를 나타내는 리터럴 구문은 여전히 ​​없습니다. {}.__class__은 여전히 ​​줄 것이다dict
Ninja420

8
@ Ninja420 첫번째 코멘트 전에 읽으려고, 내가 발견 한 그
Reishin

3
허용되는 답변은 여전히 ​​올 바르며 구식이 아닙니다. 빈 집합에 대한 리터럴 구문 은 없지만 빈 사전에 대한 구문 이 있습니다.
AndreasHassing

2
비어있는 경우에는 @ AndreasBjørn이지만 비어 있지 않은 경우 PEP8 예외가 발생하고 set literal을 사용하라는 제안이 표시됩니다.
Reishin

실제로, pyt3.6으로 {}.__class__반환 <class 'dict'>', 아닙니다<type 'dict'>
klew

6

비교 또는 할당을 위해 리터럴을 원하는지 여부에 따라 다릅니다.

기존 세트를 비우 .clear()려면, 특히 새 객체를 작성하지 않으려는 경우, 방법을 사용할 수 있습니다 . 비교를하려면 set()길이가 0인지 확인하거나 사용 하십시오.

예:

#create a new set    
a=set([1,2,3,'foo','bar'])
#or, using a literal:
a={1,2,3,'foo','bar'}

#create an empty set
a=set()
#or, use the clear method
a.clear()

#comparison to a new blank set
if a==set():
    #do something

#length-checking comparison
if len(a)==0:
    #do something

8
a=set()집합을 비우지 않고 새 집합을 만들어에 할당하여 a이전 값을 덮어 씁니다.
gerrit

과연. 그래서 새 객체를 만들지 않으려면 clear ()를 사용해야한다고 말한 것입니다. 내 의견이 약간 다르게 표현되어야한다고 생각합니다.
Brian Minton

또한 사용 표시 a.clear()방법은 약간 빠른 것보다 a=set(), 그리고 검사가 len(a)==0에 평등에 대한 검사보다 약간 빠릅니다a==set()
브라이언 민튼

3
대신에 if len(a)==0:그냥 작성하는 것만 으로 도 충분하고 (파이썬식이 더 좋습니다) if a: (편집 : 또는 if not a:조건의 극성과 일치시키기 위해).
Jim Oldfield

2

미친 아이디어에 추가 : 파이썬 3에서 유니 코드 식별자를 허용하면 변수를 선언하고 ϕ = frozenset()(ϕ는 U + 03D5입니다) 대신 사용할 수 있습니다.


4
문제는 set객체가 변경 가능하므로에 위험에 처한다는 것 spam = ϕ; spam.add("eggs")입니다.
drdaeman 2016 년

3
고정 ϕ집합 인 경우 고정 spam.add("eggs")집합 개체에 add메서드 가 없기 때문에 실패합니다 .
Brian Minton

1
@BrianMinton :하지만 의도 된 동작입니다. 사람이 쓸 때주의 span = ϕ모두를 span하고 ϕ즉, 같은 객체를 가리 킵니다 id(span) == id(ϕ). 따라서, 경우 spam.add("eggs")일 것이다는 ϕ개체가 더 이상 빈 설정을하지 않을 것이며, drdaeman에 의해 지적 우리는 원래의 문제로 되돌아 올 것이다
레나토 가르시아

1
@RenatoGarcia 빈 dict 리터럴과 비교 :>>> a={} >>> a['foo']='bar' >>> a {'foo': 'bar'}
Brian Minton

1

예. 비어 있지 않은 dict / set에 사용되는 것과 동일한 표기법이 비어있는 표기법에 적용됩니다.

비어 있지 않은 리터럴 dictset리터럴 의 차이점에 유의하십시오.

{1: 'a', 2: 'b', 3: 'c'}- 키 - 값 쌍의 수는 내부하게 dict
{'aaa', 'bbb', 'ccc'}- 튜플 값은 내부하게set

그래서:

{}== 0의 키-값 쌍 수 == 비어 있음 dict
{*()}== 비어있는 값의 튜플 == 비어 있음set

그러나 실제로 할 수 있다고해서 꼭해야하는 것은 아닙니다. 강력한 이유가없는 한 다음과 같이 빈 세트를 명시 적으로 구성하는 것이 좋습니다.

a = set()

주의 : ctrueden 은 주석에서 알 수 있듯이 빈 세트 {()}아닙니다 . 비어있는 튜플 : 하나의 요소가있는 세트입니다.


2
{()}빈 세트가 아닙니다. 빈 튜플이라는 하나의 요소로 설정된 싱글 톤입니다. len({()})어느 것이 1인지 또는 () in {()}어느 것이 되는지 확인하여이를 확인할 수 있습니다 True.
ctrueden

1
죄송합니다. 나는 {()}다른 사람이 같은 실수를 저지르는 경우를 대비하여 빈 세트가 아니라는 메모를 추가했습니다 . 감사합니다, @ctrueden!
pycoder

-1

파이썬에서 빈 세트를 만드는 방법은 거의 없습니다.

  1. set () 메소드 사용하기
    파이썬에서 내장 변수로 해당 변수에 빈 세트를 만듭니다.
  2. clear () 메소드 사용 (크리에이티브 엔지니어 기술 LOL)
    다음 예를 참조하십시오.

    sets = { "Hi", "How", "are", "You", "All"}
    type (sets) (This Line Output : set)
    sets .clear ()
    print (sets) (This Line Output : {})
    유형 (sets) (This Line Output : set)

따라서 이것은 빈 세트를 만드는 두 가지 방법입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.