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

조회수 2491회

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

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

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

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

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

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

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.6.20 00:14

답변을 하려면 로그인이 필요합니다.

Hashcode는 개발자들을 위한 무료 QnA 사이트입니다. 계정을 생성하셔야만 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)

ᕕ( ᐛ )ᕗ
로그인이 필요합니다

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 계정을 생성하셔야만 글을 작성하실 수 있습니다.