파이썬 items의 순서와 관련해서 질문이 있습니다.


dictionary 테스트 중 궁금한점이 있습니다~

items()의 경우 결과값이 enumerate() 와 달리 일정하지 않은 것으로 알고 있습니다.

근데 키값을 숫자로 주게 되면 내림차순으로 정렬이 됩니다. (10이상의 값을 주면 또 값이 달라지더군요..)

키값에 숫자와 문자열이 합쳐져 있다면 또 랜덤으로 결과값이 출력됩니다....

items()의 정확한 기준을 알고 싶습니다

아니면 순서를 저장해야한다면 굳이 dictionary를 사용할 필요가 없는 걸까요?

  • 2016년 06월 19일에 수정됨
    루비와 파이썬을 좋아합니다. 새로운 언어를 배우는것도 좋아해요. 모바일 게임도 조금 만들어 봤습니다.
  • 2016년 06월 19일에 작성됨
    Software Engineer

조회수 253


1 답변


좋아요
2
싫어요
채택취소하기

딕셔너리에 넣은 순서를 저장해야 한다면 dictionary를 사용하면 안됩니다. 순서가 필요할때는 OrderedDict를 사용하세요.

dictionary는 hash table을 사용합니다. key의 hash값을 기준으로 순서가 정해진다고 생각하면 됩니다. 아래 코드를 실행해서 값을 확인해 보면 "abc"라는 문자열의 해시값이 어떤 값을 가지는지 확인할 수 있습니다.

print(hash("abc"));

이렇게 Hash값을 기준으로 순서가 정해지고, 그 다음에 Hash table을 구성하는 복잡한 로직에 의해 순서가 정해지기 때문에 순서는 랜덤이라고 생각하시면 됩니다.

다만, items, keys, values로 읽어오는 값은 모두 같은 순서를 가집니다. 그 이유는 해시 테이블이 배열과 같은 메모리블록에 hash, key, value를 저장하고 있기 때문입니다.

순서 hash, key, value
1 ...
2 ...
3 ...

이렇게 메모리 블럭에서 순서대로 읽어오다 보니 items, keys, values 뭘로 읽어들여도 그 순서는 변하지 않습니다.(하지만 딕셔너리에 넣은 순서와는 상관이 없습니다.)

영어라서 아쉽지만, 더 자세한 내용이 궁금하실때 보면 좋은 링크입니다.

  • 2016년 06월 19일에 작성됨
    루비와 파이썬을 좋아합니다. 새로운 언어를 배우는것도 좋아해요. 모바일 게임도 조금 만들어 봤습니다.

  • 답변 감사합니다~ 알려주신 링크랑 함께보니 이해가 쉽네요     김선우   2016.6.20 00:14     

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close