2011-08-20 4 views
3

set()이 .sort()와 매우 유사한 컬렉션을 주문한다는 인상을 받았습니다.파이썬에서 물건을 주문하는 중 ...?

그러나 나에게 특이한 것은 컬렉션을 재주문하는 이유였습니다.

>>> h = '321' 
>>> set(h) 
set(['1', '3', '2']) 
>>> h 
'321' 
>>> h = '22311' 
>>> set(h) 
set(['1', '3', '2']) 

왜 set ([ '1', '2', '3'])을 반환하지 않습니까? 나는 또한 각 사용자의 숫자가 얼마나 많은지 또는 사용 순서에 관계없이 항상 세트 ([ '1', '3', '2'])를 리턴한다. 왜?

편집 :

그래서 나는 내 대답을 읽고 이에 대한 나의 카운터는 이것입니다.

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

왜 숫자가 아닌 문자열을 주문합니까?

또한

import random 
l = [] 
for itr in xrange(101): 
    l.append(random.randint(1,101)) 

print set(l) 

출력은 파이썬 set가 정렬되지

>>> 
set([1, 2, 4, 5, 6, 8, 10, 11, 12, 14, 15, 16, 18, 19, 23, 24, 25, 26, 29, 30, 31, 32, 34, 40, 43, 45, 46, 47, 48, 49, 50, 51, 53, 54, 55, 57, 58, 59, 60, 61, 62, 63, 64, 66, 67, 69, 70, 74, 75, 77, 79, 80, 83, 84, 85, 87, 88, 89, 90, 93, 94, 96, 97, 99, 101]) 

답변

4

은, 따라서 당신이 경우 당신이 그들에게

을 지정 같은 요소가 같은 방법으로 주문할 것이라는 보장은 없습니다 정렬 된 출력을 원한다면 정렬을 호출하십시오.

sorted(set(h)) 

당신의 편집에 응답 : 그것은 세트의 구현에 달려 있습니다. 세트가 해시합니다 (__hash__ 기능)으로 분류한다

1) 한계는 일반적으로 2

의 다음으로 큰 힘을

2) 제한을 모듈로

: CPython에, 그것은 두 가지로 요약 할

[x==x.__hash__() for x in xrange(1000)].count(False) # = 0 
,536,913 :

의 int에 대한
x=1 
type(x) # int 
x.__hash__() # 1 

가, 해시 원래 값과 동일 :

그래서는 INT의 경우를 살펴 보자

따라서 모든 값이 정수인 경우 정수 해시 값을 사용하고 모든 것이 원활하게 작동합니다.문자열 표현에 대한

, 해시는 같은 방식으로 작동 해달라고 :

x='1' 
type(x) 
# str 
x.__hash__() 
# 6272018864 

이해를하는 이유 [ '1', '2', '3', 그 해시 값을보고에 대한 정렬 나누기 : 예에서는

[str(x).__hash__() for x in xrange(1,4)] 
# [6272018864, 6400019251, 6528019634] 

는 모드 값은 4 (3 elts^1 = 2, 2^2 = 4)이 될 정렬 경우 지금 그렇게

[str(x).__hash__()%4 for x in xrange(1,4)] 
# [0, 3, 2] 
[(str(x).__hash__()%4,str(x)) for x in xrange(1,4)] 
# [(0, '1'), (3, '2'), (2, '3')] 

python documentation of the set type에서

[y[1] for y in sorted([(str(x).__hash__()%4,str(x)) for x in xrange(1,4)])] 
# ['1', '3', '2'] 
+0

훌륭한 답변입니다. – John

1

: AST, 당신은 당신이 세트에서 볼 수있는 순서를 얻을

일련의 객체가 별개의 해쉬 객체의 정렬되지 않은 모음입니다.

이것은 집합에 요소의 순서 개념이 없음을 의미합니다. 비정상적인 순서로 요소가 화면에 인쇄되면 놀라지 말아야합니다.

1

파이썬의 세트는 용어의 수학적 의미에서 "집합"을 시도합니다. 중복이 없으며 순서가 중요하지 않습니다.

관련 문제