source

Python에서 집합을 초기화하기 위해 물결 괄호 사용

lovecheck 2023. 7. 21. 21:41
반응형

Python에서 집합을 초기화하기 위해 물결 괄호 사용

파이썬을 배우고 있는데, 세트 초기화에 대한 초보적인 질문이 있습니다.테스트를 통해 세트를 다음과 같이 초기화할 수 있다는 것을 알게 되었습니다.

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

다음과 같은 일반적인 방법과 달리 이러한 방법을 사용할 경우의 단점이 있습니까?

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

아니면 단지 스타일의 문제인가요?

세트 리터럴 구문에는 두 가지 분명한 문제가 있습니다.

my_set = {'foo', 'bar', 'baz'}
  1. 파이썬 2.7 이전에는 사용할 수 없습니다.

  2. 해당 구문을 사용하여 빈 집합을 표현할 수 없습니다(사용).{}빈 딕트 생성)

그것들은 당신에게 중요할 수도 있고 그렇지 않을 수도 있습니다.

이 구문을 설명하는 문서 섹션은 다음과 같습니다.

또한 차이를 비교합니다.{}그리고.set()단 한 마디의 논쟁으로

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

그러나 둘 다a그리고.b물론입니다.

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', '{', '}'])

당신은 해야 합니다.empty_set = set()빈 집합을 초기화합니다.{}비어 있음dict.

아무도 이에 대해 언급하지 않은 것은 놀라운 일이지만, 이 두 구문 사이에는 실제로 제가 알 수 있는 것과는 차이가 있는 것 같습니다. 즉, 성능/최적화입니다.

대부분의 상황에서 차이는 무시할 수 있어야 하지만, 당신의 예에서 다음은 다음과 같습니다.set항목에서 직접:

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

다음은 다음을 생성하는 동안list그리고 나서 그것을 그에게 전달합니다.set생성자:

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

최종 결과는 동일하지만, 우리는 두 가지 약간 다른 방법으로 결과를 얻고 있습니다.예상하신 대로, 두 번째 것은 조금 느립니다.

❯ python -m timeit 'my_set = {"foo", "bar", "baz"}'
10000000 loops, best of 5: 37.3 nsec per loop

❯ python -m timeit 'my_set = set(["foo", "bar", "baz"])'
5000000 loops, best of 5: 92.3 nsec per loop

제가 아는 한,{}문자 그대로의 구문은 다음을 구성할 때 중간 편집기를 만드는 것을 건너뛸 수 있는 유일한 방법입니다.set개인적으로 좀 이상한 것 같아요.set생성자는 대신 다음과 같은 다양한 수의 위치 인수를 사용하도록 설계되지 않았습니다.

# This usage is invalid in real Python. If it existed,
# I would expect the call to be exactly equivalent
# to the performance of the literal syntax.
>>> set("foo", "bar", "baz")

# You would then construct a `set` from an existing
# `list` by simply unpacking the sequence.
>>> set(*["foo", "bar", "baz"])

안타깝게도 해당 서명은 존재하지 않습니다.

언급URL : https://stackoverflow.com/questions/17373161/use-curly-braces-to-initialize-a-set-in-python

반응형