2013-03-03 2 views
34

파이썬에서 set()은 중복 요소가없는 순서가없는 콜렉션입니다. 그러나 출력을 생성하는 방법을 이해할 수 없습니다.set() 함수 이해하기

>>> x = [1, 1, 2, 2, 2, 2, 2, 3, 3] 
>>> set(x) 
set([1, 2, 3]) 

>>> y = [1, 1, 6, 6, 6, 6, 6, 8, 8] 
>>> set(y) 
set([8, 1, 6]) 

>>> z = [1, 1, 6, 6, 6, 6, 6, 7, 7] 
>>> set(z) 
set([1, 6, 7]) 

set(y)의 출력은 있어야하지 : set([1, 6, 8])

예를 들어, 다음 사항을 고려? 나는 Python 2.6에서 위의 두 가지를 시도했다.

+35

당신은 세트가 * 정렬되지 않은 컬렉션이라고 말했습니다. ... – Volatility

답변

50

세트, 순서가 있습니다. 집합을 구현하는 한 가지 방법은 트리를 사용하는 경우에도 해시 테이블을 사용하여 구현할 수 있습니다. 즉, 정렬 된 순서로 키를 가져 오는 것은 그리 간단하지 않을 수 있습니다.

당신이 그들을 분류하려는 경우, 당신은 간단하게 수행 할 수 있습니다 집합의 요소를 포함하는 정렬 된 목록을 생성합니다

sorted(set(y)) 

.

그렇지 않으면 set으로 보장되는 것은 요소를 고유하게 만드는 것입니다 (두 번 이상 존재하지 않음).

희망이 도움이됩니다.

+2

참고 : 일반적으로 세트는 나무를 사용하여 구현할 수 있습니다. 파이썬에서'set '은 (의미있게) 아이템을 해쉬 할 수 있어야하고, 비교할 필요가 없다는 것을 보장하기 때문에 의미가 있습니다. – delnan

+0

@delnan 좋은 지적. – user

+1

@delnan - 그리고 단지 풍부 해지기 위해서, 당신은 * 부자 비교 * ('<', '>')를 의미합니다. 객체가 "해시 가능"하기 위해서는'__eq__'를 구현해야합니다. – mgilson

6

As + 휘발성과 자신이 지적한대로, 집합은 순서가 없습니다. 당신이 순서로 요소를 필요한 경우 만 세트에 sorted 전화 : 당신이 말한대로

>>> y = [1, 1, 6, 6, 6, 6, 6, 8, 8] 
>>> sorted(set(y)) 
[1, 6, 8] 
11

정렬되지 않은 컬렉션 유형으로 set([8, 1, 6])set([1, 6, 8])과 같습니다.

집합 내용을 정렬 된 순서로 표시하는 것이 더 좋을 수도 있지만 repr() 호출이 더 비쌉니다.

내부적으로 해시 테이블을 사용하여 set 유형이 구현됩니다. 항목이 집합의 일부인지 확인하는 데 필요한 동등 연산 수를 줄이기 위해 해시 함수를 사용하여 항목을 여러 버킷으로 분리합니다.

출력을 repr() 출력하려면 각 버킷의 항목을 순서대로 출력해야하는데, 정렬 된 순서는 아닙니다.

4

파이썬의 집합 (및 사전)은 의 순서로 반복되고 인쇄되지만 그 순서는 임의적이며 추가 및 제거 후에도 동일하게 유지되지 않을 수 있습니다.

>>> s = set([1,6,8]) 
>>> print(s) 
{8, 1, 6} 
>>> s.update(range(10,100000)) 
>>> for v in range(10, 100000): 
    s.remove(v) 
>>> print(s) 
{1, 6, 8} 

이 비록 구현에 의존하고, 그래서 당신은 그것에 의존해서는 안 :

여기에 값이 많이 추가하고 제거 후에 순서를 변경 세트의 예입니다.

1

나는 오늘 같은 질문을 던지고 답을 얻었습니다. 나는 아직도 이해하기 어려웠다 왜 세트가 나오지 않는지.

내 파트너에게이 사실을 알리고 그는이 비유를 생각해 냈습니다. 대리석을 가져 왔습니다.대리석 너비보다 더 넓은 튜브에 튜브를 넣으십시오. 목록이 있습니다. 그러나 세트는 가방입니다. 비록 당신이 가방에 구슬을 하나씩 먹여도; 백에서 백 튜브로 다시 부어 넣을 때, 그들은 같은 순서로되지 않을 것입니다. 왜냐하면 그들은 모두 가방에 섞여 있기 때문입니다.