파이썬에서 언제 Dictionary, List 또는 Set을 사용해야합니까?


답변:


603

A는 list주문을 유지 dict하고 set하지 말아야 할 것 : 주문에 관심이있을 때는 반드시 사용해야합니다 list(컨테이너 선택이이 세 가지로 제한되는 경우 물론 ;-).

dict각 키 값을 가진 동료, 동안 listset분명히 매우 다른 사용 사례 : 단지 값이 포함되어 있습니다.

set해시 가능 항목이 필요 list하지 않습니다. 해시 가능 항목이 없으면 사용할 수 없으며 set대신 사용해야 list합니다.

set중복을 금지 list하지 않으며 중요한 차이점도 아닙니다. 항목에 대해 서로 다른 계산에 중복 매핑 (A "MULTISET는"한 번 이상,에서 찾을 수 있습니다 선물합니다 collections.Counter- 당신이 하나를 만들 수있다 dict, 만약 당신이 수있는 몇 가지 이상한 이유는 아니다 수입 collections에서, 또는 사전 2.7 collections.defaultdict(int)항목을 키로 사용하고 관련 값을 개수로 사용하여 Python ).

set(또는 dict키의 경우) 값의 멤버쉽을 확인하는 것은 엄청나게 빠르며 (일정하고 짧은 시간을 사용함), 목록에서는 평균 및 최악의 경우 목록의 길이에 비례하여 시간이 걸립니다. 당신이 해쉬 항목이 경우에 따라서, 주문 또는 중복에 대한 어느 쪽이든 상관, 그리고 빠른 회원 검사를하지 않는 set것보다 낫다 list.


6
파이썬 3.7은 기본적으로 dict 순서대로되어 있습니다
Gigi Bayte 2

172
  • 주문한 일련의 품목 만 필요합니까? 목록으로 이동하십시오.
  • 이미 특정 가치를 가지고 있는지 , 주문하지 않고 (그리고 중복을 저장할 필요가 없는지) 알아야합니까? 세트를 사용하십시오.
  • 값을 키와 연결해야하므로 나중에 키별로 효율적으로 찾을 수 있습니까? 사전을 사용하십시오.

30
:-) 알렉스 M.함으로써 상기 대답 「DR TL "부분이이되어야
알렉스 Boschmans

9
알렉산더는 존에게 투표권을 기증해야한다. 이 답변은 거의 모든 것을 다루며 훨씬 간결하고 명확합니다.
mehmet

그러나 이러한 데이터 유형 간의 시간 복잡도 차이를 알고 싶다면 Alex의 설명이 더 효과적입니다.
kcEmenike

19

정렬되지 않은 고유 요소 컬렉션을 원할 경우을 사용하십시오 set. (예를 들어, 문서에 사용 된 모든 단어 세트를 원할 때).

변경 불가능한 순서로 정렬 된 요소 목록을 수집하려면을 사용하십시오 tuple. (예를 들어, 세트에서 요소로 사용하려는 (name, phone_number) 쌍을 원할 경우 세트가 요소를 변경할 수 없으므로 목록이 아닌 튜플이 필요합니다).

가변 순서로 정렬 된 요소 목록을 수집하려면을 사용하십시오 list. (예 : 목록에 새 전화 번호를 추가하려는 경우 : [number1, number2, ...]).

키에서 값으로 매핑하려면을 사용하십시오 dict. (예를 들어, 전화 번호에 이름을 매핑하는 전화 번호부를 원할 경우 :) {'John Smith' : '555-1212'}. dict의 키는 순서가 없습니다. dict (전화 번호부)을 반복하면 키 (이름)가 임의의 순서로 표시 될 수 있습니다.


어, 그는 튜플에 대해 묻지 않았습니다.
habnabit

18
  • 값에 맵핑되는 고유 키 세트가있는 경우 사전을 사용하십시오.

  • 주문한 항목 모음이있는 경우 목록을 사용하십시오.

  • 세트를 사용하여 정렬되지 않은 항목 세트를 저장하십시오.


6

간단히 말해서 다음을 사용하십시오.

list -주문한 순서의 항목이 필요한 경우.

dict -값을 키와 관련시켜야하는 경우

set -고유 한 요소를 유지해야하는 경우

상해

명부

목록은 일반적으로 동종 항목의 컬렉션을 저장하는 데 사용되는 변경 가능한 시퀀스입니다.

리스트는 모든 공통 시퀀스 연산을 구현합니다.

  • x in lx not in l
  • l[i], l[i:j],l[i:j:k]
  • len(l), min(l),max(l)
  • l.count(x)
  • l.index(x[, i[, j]])-의 첫번째 발생의 색인 x에서 l(또는 그 이후 i와 이전 j굴절률들)

또한리스트는 변경 가능한 모든 시퀀스 작업을 구현합니다.

  • l[i] = x- 항목 il로 대체x
  • l[i:j] = t- 조각 l에서 i로는 j반복자의 내용으로 대체t
  • del l[i:j] -와 동일 l[i:j] = []
  • l[i:j:k] = t-의 요소는 l[i:j:k]다음 의 요소로 대체t
  • del l[i:j:k]- s[i:j:k]목록에서 요소를 제거합니다
  • l.append(x)- x시퀀스의 끝에 추가
  • l.clear()-에서 모든 항목을 제거합니다 l(del과 동일 l[:]).
  • l.copy()-의 얕은 사본을 만듭니다 l(와 동일 l[:])
  • l.extend(t)또는 l += t- l내용으로 확장t
  • l *= n- 업데이트 l에 그 내용을 반복 n
  • l.insert(i, x)- 삽입 xl의해 지정된 인덱스에서i
  • l.pop([i])-에서 항목을 검색하고 i제거합니다.l
  • l.remove(x)-x와 같은 l곳 에서 첫 번째 항목을 제거하십시오.l[i]
  • l.reverse()- l제자리에 있는 항목을 뒤집 습니다

목록이 방법을 이용하여 적층으로 사용될 수 appendpop.

사전

사전은 해시 가능 값을 임의의 객체에 매핑합니다. 사전은 변경 가능한 객체입니다. 사전의 주요 작업은 일부 키와 함께 값을 저장하고 해당 키에서 주어진 값을 추출하는 것입니다.

사전에서는 해시 가능하지 않은 키 값, 즉 목록, 사전 또는 기타 변경 가능한 유형을 포함하는 값으로 사용할 수 없습니다.

세트

세트는 고유 한 해시 가능 객체의 정렬되지 않은 컬렉션입니다. 집합은 일반적으로 멤버쉽 테스트, 시퀀스에서 중복 제거, 교차, 합집합, 차이 및 대칭 차이와 같은 수학 연산 계산을 포함하는 데 사용됩니다.


5

이것은 sets를 다루지 않지만 dicts와 lists에 대한 좋은 설명입니다 .

목록은 그들이 보이는 것-값의 목록입니다. 이들 각각은 0부터 시작하여 번호가 매겨집니다. 첫 번째는 0, 두 번째 1, 세 번째 2 등입니다. 목록에서 값을 제거하고 끝에 새 값을 추가 할 수 있습니다. 예 : 많은 고양이 이름.

사전은 이름에서 제안하는 사전과 유사합니다. 사전에는 단어의 '인덱스'가 있으며 각 단어마다 정의가 있습니다. 파이썬에서는 단어를 '키'라고하고 정의를 '값'이라고합니다. 사전의 값은 번호가 매겨져 있지 않으며 이름에서 제안하는 것과 비슷한 용기 값입니다. 사전에는 단어의 '인덱스'가 있으며 각 단어마다 정의가 있습니다. 사전의 값은 번호가 매겨져 있지 않으며 특정한 순서가 아니거나 키도 마찬가지입니다. 사전의 값을 추가, 제거 및 수정할 수 있습니다. 예 : 전화 번호부.

http://www.sthurlow.com/python/lesson06/


4

C ++의 경우 항상이 흐름도를 염두에 두었습니다. 어떤 시나리오에서 특정 STL 컨테이너를 사용합니까? 그래서 Python3에서도 비슷한 것을 사용할 수 있는지 궁금했지만 운이 없었습니다.

파이썬에서 명심해야 할 것은 : C ++에 대한 단일 파이썬 표준은 없습니다. 따라서 다른 파이썬 인터프리터 (예 : CPython, PyPy)에는 큰 차이가있을 수 있습니다. 다음 순서도는 CPython에 대한 것입니다.

또한 내가 그림에 다음 데이터 구조를 통합 할 수있는 좋은 방법을 찾을 수 없습니다 : bytes, byte arrays, tuples, named_tuples, ChainMap, Counter,와 arrays.

  • OrderedDictdeque를 통해 사용할 수있는 collections모듈.
  • heapqheapq모듈 에서 사용 가능
  • LifoQueue, Queue및 동시 (스레드) 액세스 용으로 설계된 모듈을 PriorityQueue통해 사용할 수 queue있습니다. ( multiprocessing.Queue사용 가능한 것도 있지만 차이점을 queue.Queue모르지만 프로세스에서 동시 액세스가 필요할 때 사용해야한다고 가정합니다.)
  • dict, set, frozen_set, 그리고 list물론 내장되어

이 답변을 개선하고 모든 측면에서 더 나은 다이어그램을 제공 할 수 있다면 누구나 감사 할 것입니다. 부담없이 환영하십시오. 순서도

추신 : 다이어그램은 yed로 만들어졌습니다. graphml 파일 은 여기


3

list , dictssets 와 함께 흥미로운 Python 객체 인 OrderedDicts도 있습니다.

정렬 된 사전은 일반 사전과 유사하지만 항목이 삽입 된 순서를 기억합니다. 정렬 된 사전을 반복하면 키가 처음 추가 된 순서대로 항목이 반환됩니다.

OrderedDicts 는 키 순서를 유지해야 할 때 유용합니다 (예 : 문서 작업). 문서에서 모든 용어의 벡터 표현이 일반적입니다. 따라서 OrderedDicts 를 사용 하면 이전에 용어를 읽었는지, 용어를 추가하고, 용어를 추출하고, 모든 조작 후에 순서화 된 벡터 표현을 추출 할 수 있습니다.


1

기울기 은 보이는 것처럼 보이는 값입니다. 이들 각각은 0부터 시작하여 번호가 매겨집니다. 첫 번째는 0, 두 번째 1, 세 번째 2 등입니다. 목록에서 값을 제거하고 끝에 새 값을 추가 할 수 있습니다. 예 : 많은 고양이 이름.

튜플 은 목록과 같지만 값을 변경할 수 없습니다. 당신이 먼저 포기하는 가치는 당신이 프로그램의 나머지 부분에 붙어있는 가치입니다. 다시, 각 값은 쉽게 참조 할 수 있도록 0부터 시작하여 번호가 매겨집니다. 예 : 연도의 이름.

사전 은 이름에서 제안하는 사전과 유사합니다. 사전에는 단어의 '인덱스'가 있으며 각 단어마다 정의가 있습니다. 파이썬에서는 단어를 '키'라고하고 정의를 '값'이라고합니다. 사전의 값은 번호가 매겨져 있지 않으며 이름에서 제안하는 것과 비슷한 용기 값입니다. 사전에는 단어의 '인덱스'가 있으며 각 단어마다 정의가 있습니다. 파이썬에서는 단어를 '키'라고하고 정의를 '값'이라고합니다. 사전의 값은 번호가 매겨져 있지 않으며 특정한 순서가 아니거나 키도 마찬가지입니다. 사전의 값을 추가, 제거 및 수정할 수 있습니다. 예 : 전화 번호부.


1

그것들을 사용할 때, 나는 당신의 참고를 위해 그들의 방법에 대한 완전한 치트 시트를 만듭니다.

class ContainerMethods:
    def __init__(self):
        self.list_methods_11 = {
                    'Add':{'append','extend','insert'},
                    'Subtract':{'pop','remove'},
                    'Sort':{'reverse', 'sort'},
                    'Search':{'count', 'index'},
                    'Entire':{'clear','copy'},
                            }
        self.tuple_methods_2 = {'Search':'count','index'}

        self.dict_methods_11 = {
                    'Views':{'keys', 'values', 'items'},
                    'Add':{'update'},
                    'Subtract':{'pop', 'popitem',},
                    'Extract':{'get','setdefault',},
                    'Entire':{ 'clear', 'copy','fromkeys'},
                            }
        self.set_methods_17 ={
                    'Add':{['add', 'update'],['difference_update','symmetric_difference_update','intersection_update']},
                    'Subtract':{'pop', 'remove','discard'},
                    'Relation':{'isdisjoint', 'issubset', 'issuperset'},
                    'operation':{'union' 'intersection','difference', 'symmetric_difference'}
                    'Entire':{'clear', 'copy'}}

1

사전 : 파이썬 사전은 키를 색인으로, 객체를 값으로 사용하는 해시 테이블처럼 사용됩니다.

목록 : 목록은 배열에서 해당 개체의 위치별로 색인이 생성 된 배열의 개체를 보유하는 데 사용됩니다.

집합 : 집합은 개체가 집합에 있는지 여부를 알 수있는 기능이있는 모음입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.